1. Trang chủ
  2. » Thể loại khác

Luận văn tìm hiểu lập trình đa luồng trong java và ứng dụng

77 8 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Tìm hiểu lập trình đa luồng trong Java và ứng dụng
Tác giả Nguyễn Thị Hoàng
Người hướng dẫn Thầy Giáo Phùng Anh Tuấn
Trường học Trường Đại học Dân lập Hải Phòng
Chuyên ngành Công nghệ thông tin
Thể loại Đồ án tốt nghiệp
Năm xuất bản 2009
Thành phố Hải Phòng
Định dạng
Số trang 77
Dung lượng 2,8 MB

Cấu trúc

  • CHƯƠNG 1: CĂN BẢN VỀ MẠNG MÁY TÍNH (6)
    • 1.1. Định nghĩa mạng máy tính (6)
    • 1.2. Nhu cầu phát triển mạng máy tính (7)
    • 1.3. Phân loại mạng máy tính (8)
    • 1.4. Một số topo mạng thông dụng (8)
    • 1.5. Giao thức mạng (9)
      • 1.5.1. Giao thức TCP/IP (9)
      • 1.5.2 Giao thức UDP (13)
    • 1.6. Các mô hình hoạt động của mạng máy tính (14)
      • 1.6.1. Mô hình mạng hoạt động theo dạng peer to peer (14)
      • 1.6.2. Mô hình mạng hoạt động theo dạng clients/ server (14)
  • CHƯƠNG 2: SƠ LƯỢC VỀ NGÔN NGỮ LẬP TRÌNH JAVA (16)
    • 2.1. Giới thiệu (16)
    • 2.2. Một số tính chất của ngôn ngữ Java (16)
      • 2.2.1. Đơn giản (16)
      • 2.2.2. Hướng đối tượng (17)
      • 2.2.3. Độc lập phần cứng và hệ điều hành (17)
      • 2.2.4. Mạnh mẽ (18)
      • 2.2.5. Bảo mật (18)
      • 2.2.6. Phân tán (19)
      • 2.2.7. Đa luồng (19)
      • 2.2.8. Linh động (19)
    • 2.3. Các dạng chương trình ứng dụng của Java (19)
      • 2.3.1. Chương trình ứng dụng dạng độc lập (Application) (19)
      • 2.3.2. Chương trình ứng dụng dạng nhúng (Applet) (20)
      • 2.3.3. Chương trình ứng dụng dạng lai ghép (21)
    • 2.4. Cấu trúc của tệp chương trình Java (21)
  • CHƯƠNG 3: LẬP TRÌNH SOCKET TCP (23)
    • 3.1. Định nghĩa (23)
    • 3.3. Lập trình Socket TCP trong Java (27)
      • 3.3.1. Xây dựng chương trình clients ở chế độ hướng kết nối (28)
      • 3.3.2. Xây dựng chương trình server ở chế độ hướng kết nối (29)
  • CHƯƠNG 4: LUỒNG TRONG JAVA (31)
    • 4.1. Khái niệm luồng (31)
      • 4.1.1. Tiếp cận luồng ở mức người dùng (33)
      • 4.1.2. Tiếp cận luồng ở mức hạt nhân hệ điều hành (34)
    • 4.2. Luồng trong Java (34)
      • 4.2.1. Các phương pháp thực hiện luồng (34)
      • 4.2.2. Độ ƣu tiên của các luồng (0)
      • 4.2.3. Nhóm luồng (40)
      • 4.2.4. Đồng bộ hóa các luồng thi hành (40)
  • CHƯƠNG 5: CHƯƠNG TRÌNH ỨNG DỤNG (43)
    • 5.1. Giới thiệu (43)
    • 5.2. Mô hình chung truy nhập cơ sở dữ liệu Web (44)
    • 5.3. Chương trình ứng dụng (45)
      • 5.3.1. Mô hình và cơ chế hoạt động (45)
      • 5.3.2. Thiết kế và cài đặt cơ sở dữ liệu thử nghiệm (46)
      • 5.3.3. Thiết kế chương trình (48)
      • 5.3.4. Một số giao diện chính (50)
    • 5.4. Nhận xét (62)
  • KẾT LUẬN (63)
  • TÀI LIỆU THAM KHẢO (64)
  • PHỤ LỤC (65)
    • 1. Hướng dẫn tạo tệp chính sách .java.policy (65)
    • 2. Mã nguồn chương trình (71)

Nội dung

CĂN BẢN VỀ MẠNG MÁY TÍNH

Định nghĩa mạng máy tính

Mạng máy tính là tập hợp các máy tính được kết nối qua đường truyền, cho phép trao đổi thông tin giữa chúng Đường truyền, bao gồm các thiết bị truyền dẫn có dây và không dây, chuyển tín hiệu điện tử dưới dạng xung nhị phân (on - off) Tất cả tín hiệu này đều thuộc dạng sóng điện từ, và tùy theo tần số, có thể sử dụng các loại đường truyền vật lý như cáp đồng trục, cáp xoắn, cáp quang, dây điện thoại, và sóng vô tuyến Hai khái niệm đường truyền và cấu trúc mạng là những đặc trưng cơ bản của mạng máy tính.

Hình 1.1 Một mô hình các máy tính liên kết trong mạng

Sinh viên: Nguyễn Thị Hoàng - Khoa CNTT - ĐHDL Hải Phòng

Nhu cầu phát triển mạng máy tính

Hiện nay, việc kết nối máy tính trong các văn phòng và cơ quan ngày càng trở nên cần thiết do sự gia tăng nhanh chóng số lượng máy tính Kết nối này không chỉ giúp nâng cao hiệu quả làm việc mà còn tối ưu hóa quy trình sử dụng cho người dùng.

Trong bối cảnh thông tin ngày càng phong phú và nhu cầu xử lý thông tin tăng cao, mạng máy tính đã trở thành một phần thiết yếu trong nhiều lĩnh vực như thương mại, dịch vụ, giáo dục, khoa học, quân sự và quốc phòng.

Người ta thấy được việc kết nối các máy tính thành mạng cho chúng ta những khả năng mới to lớn nhƣ:

Sử dụng tài nguyên chung cho phép mọi thành viên trong mạng truy cập các tài nguyên như thiết bị, chương trình và dữ liệu mà không cần quan tâm đến vị trí của chúng Điều này tạo ra sự thuận tiện và hiệu quả trong việc chia sẻ tài nguyên giữa các thành viên.

- Tăng độ tin cậy của hệ thống: người ta có thể dễ dàng bảo trì máy móc, lưu trữ

Việc sao lưu dữ liệu chung rất quan trọng, giúp khôi phục nhanh chóng khi hệ thống gặp sự cố Nếu một trạm làm việc gặp trục trặc, người dùng có thể dễ dàng sử dụng các trạm khác để thay thế.

Nâng cao chất lượng và hiệu quả khai thác thông tin là rất quan trọng, vì khi thông tin được sử dụng chung, người dùng có khả năng tổ chức lại công việc một cách linh hoạt hơn, thích ứng với những thay đổi về chất lượng.

+ Ðáp ứng những nhu cầu của hệ thống ứng dụng kinh doanh hiện đại

+ Cung cấp sự thống nhất giữa các dữ liệu

+ Tăng cường năng lực xử lý nhờ kết hợp các bộ phận phân tán

+ Tăng cường truy nhập tới các dịch vụ mạng khác nhau đang được cung cấp trên thế giới

Với nhu cầu ngày càng cao của xã hội, kỹ thuật mạng trở thành mối quan tâm hàng đầu của các chuyên gia công nghệ thông tin Việc truy xuất thông tin nhanh chóng và tối ưu là thách thức lớn, đặc biệt khi lượng thông tin trên mạng ngày càng tăng, dẫn đến tình trạng tắc nghẽn và mất mát dữ liệu Hiện nay, xây dựng một hệ thống mạng hoạt động hiệu quả, an toàn và mang lại lợi ích kinh tế cao đang được chú trọng.

Phân loại mạng máy tính

Hiện nay, sự phát triển rộng rãi của mạng máy tính cùng với những ứng dụng ngày càng đa dạng đã khiến cho việc phân loại mạng máy tính trở nên phức tạp.

Dựa theo phạm vi phân bố của mạng ta có thể phân ra các loại mạng nhƣ sau:

- GAN (Globa Area Network): kết nối máy tính giữa các châu lục với nhau thông qua mạng viễn thông và vệ tinh

WAN (Wide Area Network) là mạng kết nối máy tính trong nội bộ các quốc gia hoặc giữa các quốc gia trong một châu lục, thực hiện kết nối thông qua mạng viễn thông.

Mạng đô thị (MAN) là một loại mạng kết nối các máy tính trong phạm vi của một thành phố, sử dụng môi trường truyền thông có tốc độ cao từ 50 đến 100 Mbps.

Mạng cục bộ (LAN) là một hệ thống kết nối các máy tính trong một khu vực hạn chế, thường có bán kính khoảng vài trăm mét Kết nối này diễn ra trong môi trường truyền thông với tốc độ cao, và mạng LAN thường được áp dụng trong các cơ quan hoặc tổ chức, do đó trở thành một giải pháp rất phổ biến.

Một số topo mạng thông dụng

Mạng máy tính được định nghĩa là các máy tính kết nối với nhau qua các đường truyền vật lý theo một kiến trúc nhất định, gọi là Topology Có ba loại kiến trúc mạng phổ biến: mạng hình sao (Star Topology), mạng dạng tuyến (Bus Topology) và mạng dạng vòng (Ring Topology).

Mạng Ring Topology được cấu trúc theo hình vòng tròn, với cáp được thiết kế thành một vòng khép kín, cho phép tín hiệu di chuyển theo một chiều nhất định Trong mạng này, các nút chỉ có thể truyền tín hiệu cho nhau thông qua một nút duy nhất tại một thời điểm Một ưu điểm của mạng vòng là khả năng mở rộng dễ dàng, tuy nhiên, nó cũng có nhược điểm là nếu một đoạn cáp bị ngắt, toàn bộ hệ thống sẽ ngừng hoạt động.

Sinh viên: Nguyễn Thị Hoàng - Khoa CNTT - ĐHDL Hải Phòng

Trong mạng Bus Topology, tất cả các nút được kết nối qua một đường truyền chính (bus) và được giới hạn ở hai đầu bởi các đầu nối đặc biệt gọi là Terminator Khi một nút gửi dữ liệu, tín hiệu sẽ được phát tán theo hai chiều, cho phép tất cả các nút khác nhận tín hiệu trực tiếp Mạng này sử dụng ít cáp và dễ dàng lắp đặt, tuy nhiên, nó cũng gặp phải một số bất lợi như ùn tắc giao thông khi lưu lượng lớn và khó phát hiện sự cố nếu có hỏng hóc ở đoạn nào đó Hơn nữa, nếu một nút ngừng hoạt động, toàn bộ hệ thống sẽ bị ảnh hưởng.

Hình 1.3 Bus Topology Hình 1.4 Star Topology

Mạng hình sao là một cấu trúc mạng bao gồm một bộ tập trung và các nút thông tin như trạm cuối, máy tính hoặc thiết bị khác Với nguyên lý kết nối song song, mạng vẫn hoạt động bình thường ngay cả khi một nút bị hỏng Hơn nữa, mạng có khả năng mở rộng hoặc thu hẹp theo nhu cầu của người sử dụng, tuy nhiên việc mở rộng phụ thuộc vào khả năng của bộ tập trung.

Giao thức mạng

Giao thức mạng là tập hợp các quy tắc và quy ước cho việc trao đổi thông tin giữa hai hệ thống máy tính hoặc thiết bị máy tính Nó được coi là ngôn ngữ mà các máy tính trong mạng sử dụng để truyền dữ liệu Trong số nhiều loại giao thức như Apple Talk, DLC, và NetBEUI, giao thức TCP/IP hiện đang được sử dụng phổ biến nhất trong mạng máy tính.

Giao thức TCP/IP, phát triển từ mạng ARPANET và Internet, đóng vai trò quan trọng như giao thức mạng và vận chuyển trên Internet TCP (Transmission Control Protocol) thuộc tầng vận chuyển, trong khi IP (Internet Protocol) thuộc tầng mạng của mô hình OSI Hiện nay, bộ giao thức TCP/IP là giao thức phổ biến nhất, kết nối các máy tính và mạng một cách hiệu quả.

Hiện nay, hầu hết các máy tính trong mạng đều sử dụng giao thức TCP/IP để kết nối với nhau qua nhiều hệ thống mạng khác nhau Giao thức TCP/IP là một tập hợp các giao thức cho phép các hệ thống mạng tương tác và truyền thông tin hiệu quả.

Giao thức IP có nhiệm vụ kết nối các mạng con thành một liên kết mạng để truyền dữ liệu, đóng vai trò là giao thức tầng mạng trong mô hình OSI Là một giao thức không hướng kết nối, IP không yêu cầu thiết lập liên kết trước khi truyền dữ liệu Địa chỉ IP, dài 32 bits, được sử dụng để định danh các trạm trong liên mạng, với mỗi giao diện hỗ trợ IP được gán một địa chỉ riêng Địa chỉ IP bao gồm ba phần: bit định danh lớp mạng, địa chỉ mạng (netID) và địa chỉ máy (hostID), được chia thành bốn vùng và có thể biểu thị dưới nhiều dạng như thập phân, bát phân, thập lục phân hay nhị phân Phổ biến nhất là ký pháp thập phân có dấu chấm để tách các vùng Mục đích của địa chỉ IP là cung cấp một định danh duy nhất cho mỗi máy tính trong liên mạng.

Các địa chỉ IP được chia thành 5 lớp A, B, C, D và E, tùy thuộc vào tổ chức và kích thước của mạng con Lớp A, B và C chứa các địa chỉ có thể gán được, trong khi lớp D được dành riêng cho kỹ thuật multicasting, và lớp E được sử dụng cho các ứng dụng trong tương lai.

Sinh viên: Nguyễn Thị Hoàng - Khoa CNTT - ĐHDL Hải Phòng

Hình 1.5 Cấu trúc của các lớp địa chỉ IP

NetID là một yếu tố quan trọng để xác định các mạng riêng biệt, với mỗi mạng liên kết cần có địa chỉ mạng (netID) riêng Để phân loại địa chỉ, các bit đầu tiên của byte đầu tiên được sử dụng để xác định lớp địa chỉ: lớp A (0), lớp B (10), lớp C (110), và lớp D (1110).

11110 - lớp E) Ở đây ta xét cấu trúc của các lớp địa chỉ có thể gán đƣợc là lớp A, B, C

Phân lớp của địa chỉ IP nhƣ sau:

Mạng lớp A có địa chỉ mạng (netID) 1 byte và địa chỉ host (hostID) 3 byte, cho phép tối đa 126 mạng và hơn 16 triệu host trên mỗi mạng Lớp A thường được sử dụng cho các mạng có số trạm rất lớn.

- Mạng lớp B: địa chỉ mạng (netID) là 2 byte và địa chỉ host (hostID) là 2 byte Lớp B cho phép định danh tới 16382 mạng, với tối đa 65534 host trên mỗi mạng

Mạng lớp C có địa chỉ mạng (netID) gồm 3 byte và địa chỉ host (hostID) là 1 byte, cho phép xác định tới 2 triệu mạng với tối đa 254 host trên mỗi mạng Lớp C thường được sử dụng cho các mạng có số lượng trạm ít.

Hình 1.6 Bảng phân lớp địa chỉ IP

Một số địa chỉ đặc biệt trong mạng máy tính bao gồm địa chỉ có hostID = 0, được sử dụng để chỉ định mạng theo vùng netID Ngược lại, địa chỉ với hostID toàn số 1 nhằm hướng tới tất cả các host trong mạng netID Nếu netID cũng là toàn số 1, địa chỉ này sẽ chỉ định tất cả các host trong mạng liên mạng.

Địa chỉ IP được sử dụng để xác định các host và mạng ở tầng OSI, khác với địa chỉ vật lý (địa chỉ MAC) của các thiết bị trong mạng cục bộ như Ethernet hay Token Ring.

Trong nhiều trường hợp, mạng có thể được chia thành nhiều mạng con (subnet), và các vùng subnetid sẽ được sử dụng để định danh các mạng con này Vùng subnetid được lấy từ vùng hostID, với các ví dụ cụ thể cho lớp A, B, C.

Hình 1.7 Ví dụ địa chỉ IP khi bổ sung subnetid

Sinh viên: Nguyễn Thị Hoàng - Khoa CNTT - ĐHDL Hải Phòng

TCP là giao thức hướng kết nối, đảm bảo đường truyền dữ liệu tin cậy giữa hai máy tính Tính tin cậy của kết nối này được thể hiện qua hai đặc điểm chính.

Mỗi gói tin gửi đi cần phải đến đúng đích Để đảm bảo điều này, phía gửi sẽ chờ nhận biên nhận từ bên nhận xác nhận đã nhận gói tin Nếu không nhận được phản hồi sau một khoảng thời gian nhất định, phía gửi sẽ tiến hành phát lại gói tin Quá trình phát lại sẽ tiếp tục cho đến khi việc truyền tin thành công, nhưng nếu sau một số lần phát lại tối đa mà vẫn không thành công, phía gửi sẽ dừng việc phát tin, suy ra rằng việc truyền tin không khả thi.

Giao thức TCP đảm bảo rằng các gói tin được gửi đi sẽ được trình ứng dụng nhận theo đúng thứ tự, bất chấp việc chúng có thể đi qua nhiều con đường khác nhau trên mạng Để làm được điều này, TCP đánh số thứ tự cho từng gói tin trong khối tin chung, giúp bên nhận sắp xếp lại các gói tin theo thứ tự ban đầu một cách chính xác.

TCP cung cấp một kênh truyền thông điểm - điểm, rất phù hợp cho các ứng dụng cần giao tiếp tin cậy, chẳng hạn như HTTP (Hypertext Transfer Protocol).

Các mô hình hoạt động của mạng máy tính

Mô hình hoạt động của mạng máy tính có hai loại:

- Mô hình mạng hoạt động theo dạng peer to peer

- Mô hình mạng hoạt động theo dạng clients/server

1.6.1 Mô hình mạng hoạt động theo dạng peer to peer

Trong mạng lưới máy tính, không có máy chuyên dụng hay cấu trúc phân cấp, tất cả các máy đều bình đẳng và đóng vai trò như nhau Mỗi máy tính thường hoạt động cả như máy khách và máy chủ, do đó không có máy nào được chỉ định quản lý toàn bộ mạng Người dùng trên từng máy tự quyết định dữ liệu nào sẽ được chia sẻ để sử dụng chung trên mạng.

Hình 1.9 Mô hình mạng hoạt động theo dạng peer to peer

1.6.2 Mô hình mạng hoạt động theo dạng clients/ server

Trong mô hình mạng clients/server, có một hoặc nhiều máy chủ (server) cung cấp dịch vụ cho các máy tính khác trong mạng, được gọi là máy khách (clients).

Sinh viên: Nguyễn Thị Hoàng - Khoa CNTT - ĐHDL Hải Phòng

Mô hình mạng client/server là một cấu trúc tổng quát, trong đó server có khả năng kết nối với nhiều server khác để nâng cao hiệu quả làm việc Khi nhận yêu cầu từ client, server có thể trực tiếp xử lý yêu cầu đó hoặc chuyển tiếp yêu cầu đến một server khác để xử lý.

Máy chủ (server) thực hiện các nhiệm vụ theo yêu cầu từ máy khách (client) Nhiều dịch vụ trực tuyến hoạt động dựa trên nguyên lý nhận yêu cầu từ máy khách, xử lý thông tin và trả lại kết quả cho người dùng.

SƠ LƯỢC VỀ NGÔN NGỮ LẬP TRÌNH JAVA

Giới thiệu

Java, ngôn ngữ lập trình do Sun Microsystems giới thiệu vào tháng 6 năm 1995, đã trở thành công cụ quan trọng cho lập trình viên chuyên nghiệp Được phát triển dựa trên nền tảng của C và C++, Java kết hợp cú pháp của C với các đặc trưng hướng đối tượng của C++.

Năm 1991, các kỹ sư của Sun Microsystems đã phát triển một ngôn ngữ lập trình mới nhằm điều khiển các thiết bị điện tử như tivi, máy giặt và lò nướng Mặc dù các ngôn ngữ như C và C++ có thể thực hiện điều này, nhưng chúng lại phụ thuộc vào từng loại CPU, gây khó khăn trong việc sử dụng.

Trình biên dịch thường tốn nhiều thời gian và chi phí để phát triển, khiến việc tạo ra một trình biên dịch riêng cho mỗi loại CPU trở nên đắt đỏ Do đó, nhu cầu cần một ngôn ngữ lập trình nhanh, gọn, hiệu quả và độc lập thiết bị, cho phép chạy trên nhiều loại CPU và môi trường khác nhau, trở nên cấp thiết Ngôn ngữ "Oak" đã ra đời và được đổi tên thành Java vào năm 1995 Mặc dù không được thiết kế ban đầu cho Internet, nhưng nhờ tính năng độc lập thiết bị, Java đã nhanh chóng trở thành ngôn ngữ lập trình phổ biến cho các ứng dụng trực tuyến.

Một số tính chất của ngôn ngữ Java

Java là ngôn ngữ lập trình được phát triển từ C/C++, kế thừa và phát huy những ưu điểm của hai ngôn ngữ này Nó loại bỏ các cú pháp phức tạp, mang lại sự đơn giản và dễ sử dụng Java có nhiều đặc trưng nổi bật như: hướng đối tượng, độc lập với phần cứng và hệ điều hành, mạnh mẽ, bảo mật, hỗ trợ phân tán, đa luồng và tính linh động cao.

Các nhà thiết kế Java mong muốn tạo ra một ngôn ngữ lập trình dễ học và quen thuộc với hầu hết lập trình viên, vì vậy họ đã loại bỏ những đặc điểm phức tạp của C và C++.

- Loại bỏ thao tác con trỏ, thao tác định nghĩa chồng toán tử

- Không cho phép đa kế thừa mà sử dụng các giao diện

- Không sử dụng lệnh “goto” cũng nhƣ file header (.h)

- Loại bỏ cấu trúc “struct” và “union”

Sinh viên: Nguyễn Thị Hoàng - Khoa CNTT - ĐHDL Hải Phòng

Java là ngôn ngữ lập trình thuần hướng đối tượng, yêu cầu mọi chương trình phải được xây dựng dựa trên các đối tượng Khác với C/C++, nơi có thể tạo ra các hàm độc lập, Java chỉ cho phép tạo ra các phương thức liên kết với một lớp cụ thể Đặc biệt, Java không hỗ trợ tính năng đa kế thừa cho các đối tượng, mà thay vào đó sử dụng giao diện (interface) để thực hiện điều này.

2.2.3 Độc lập phần cứng và hệ điều hành Đối với các ngôn ngữ lập trình truyền thống như C/C++, phương pháp biên dịch đƣợc thực hiện nhƣ sau :

Hình 2.1 Cách biên dịch chương trình truyền thống

Mỗi nền tảng phần cứng yêu cầu một trình biên dịch riêng để biên dịch mã nguồn chương trình Khi chuyển sang nền tảng phần cứng khác, mã nguồn cần phải được biên dịch lại Tuy nhiên, với các chương trình viết bằng Java, trình biên dịch Javac chuyển đổi mã nguồn thành bytecode Khi chạy trên các nền tảng phần cứng khác nhau, máy ảo Java sử dụng trình thông dịch Java để chuyển bytecode thành mã thực thi phù hợp Nhờ vậy, khi thay đổi nền tảng phần cứng, người dùng không cần phải biên dịch lại mã nguồn Java.

Hình 2.2 Cơ chế dịch chương trình Java

Java là ngôn ngữ yêu cầu chặt chẽ về kiểu dữ liệu

- Kiểu dữ liệu phải khai báo tường minh

- Java không sử dụng con trỏ và các phép toán con trỏ

- Java kiểm tra tất cả các truy nhập đến mảng, chuỗi khi thực thi để đảm bảo rằng các truy nhập đó không ra ngoài giới hạn kích thước

Trong lập trình truyền thống, lập trình viên phải tự quản lý bộ nhớ, bao gồm việc cấp phát và giải phóng Tuy nhiên, điều này có thể dẫn đến lỗi nếu họ quên giải phóng bộ nhớ Ngược lại, trong Java, lập trình viên không cần lo lắng về việc này, vì quá trình cấp phát và giải phóng bộ nhớ được tự động thực hiện thông qua dịch vụ thu gom rác (garbage collection), giúp giảm thiểu rủi ro và tăng hiệu suất cho chương trình.

- Cơ chế bẫy lỗi của Java giúp đơn giản hóa qúa trình xử lý lỗi và hồi phục sau lỗi

Java cung cấp một môi trường quản lý thực thi chương trình với nhiều mức để kiểm soát tính an toàn:

- Ở mức thứ nhất, dữ liệu và các phương thức được đóng gói bên trong lớp Chúng chỉ đƣợc truy xuất thông qua các giao diện mà lớp cung cấp

- Ở mức thứ hai, trình biên dịch kiểm soát để đảm bảo mã là an toàn, và tuân theo các nguyên tắc của Java

Sinh viên: Nguyễn Thị Hoàng - Khoa CNTT - ĐHDL Hải Phòng

- Mức thứ ba đƣợc đảm bảo bởi trình thông dịch; chúng kiểm soát xem bytecode có đảm bảo các quy tắc an toàn trước khi thực thi không

- Mức thứ tƣ kiểm soát việc nạp các lớp vào bộ nhớ để giám sát việc vi phạm giới hạn truy xuất trước khi nạp vào hệ thống

Java được phát triển để hỗ trợ các ứng dụng mạng thông qua các lớp mạng (java.net), cho phép nó hoạt động hiệu quả trên nhiều nền tảng khác nhau Nhờ vào tính linh hoạt này, Java trở thành công cụ phát triển phổ biến trên Internet, nơi mà nhiều nền tảng khác nhau được sử dụng.

Chương trình Java hỗ trợ giải pháp đa luồng (Multithreading) cho phép thực thi các công việc đồng thời và đồng bộ hóa giữa các luồng Tính năng này giúp xây dựng các ứng dụng mạng hoạt động hiệu quả.

Java được phát triển như một ngôn ngữ động, phù hợp với các môi trường mở Các chương trình Java tích hợp nhiều thông tin thực thi, giúp kiểm soát và truy cập đối tượng trong quá trình chạy, từ đó cho phép liên kết mã động một cách hiệu quả.

Các dạng chương trình ứng dụng của Java

2.3.1 Chương trình ứng dụng dạng độc lập (Application)

Chương trình ứng dụng độc lập là một loại chương trình nguồn có thể thực thi trực tiếp sau khi được biên dịch Trong Java, chương trình này bắt đầu và kết thúc tại phương thức main(), tương tự như hàm main() trong các chương trình C/C++.

Khi xây dựng một ứng dụng độc lập cần lưu ý:

1 Tạo lập một lớp được định nghĩa bởi người sử dụng có phương thức main() gọi là lớp chính và bảo đảm nó đƣợc định nghĩa đúng theo đúng nguyên mẫu đƣợc quy định bởi Java

2 Kiểm tra xem liệu tệp chương trình có tên trùng với tên của lớp chính và đuôi là “.java” hay không

3 Dịch tệp chương trình nguồn “.java” để tạo ra các tệp mã bytecode có đuôi

4 Sử dụng chương trình thông dịch của Java để chạy chương trình đã dịch

2.3.2 Chương trình ứng dụng dạng nhúng (Applet)

Applet là chương trình Java đặc biệt, yêu cầu mã lệnh của chúng phải được nhúng vào trang web (các file HTM hoặc HTML) Trình duyệt web như Netscape hoặc Internet Explorer sẽ thực thi các thẻ HTML, trong khi đoạn mã lệnh của Applet được máy ảo Java thực thi trong trình duyệt Ngoài ra, người dùng cũng có thể sử dụng trình Appletviewer của JDK để thực thi Applet.

Một chương trình dạng Applet bao gồm hai tệp: “.java ” và “.html ”

Chu trình hoạt động cuả Applet:

Chương trình ứng dụng Applet được thực hiện như sau:

Khi một applet được nạp và chạy bởi trình duyệt web, nó sẽ gửi thông điệp init() kèm theo dữ liệu và kích thước của cửa sổ để khởi động chương trình applet.

- Khi bắt đầu thực hiện, Web Browser thông báo cho Applet bắt đầu bằng cách gọi phương thức start()

- Khi rời khỏi trang Web có chứa Applet thì chương trình Applet này nhận được thông điệp stop() để dừng chương trình

Hoạt động của chương trình Applet được mô tả như hình dưới

Hình 2.3 Chu trình hoạt động của Applet

Sinh viên: Nguyễn Thị Hoàng - Khoa CNTT - ĐHDL Hải Phòng

- init(): phương thức này được gọi khi Applet được nạp lần đầu và được xem như là toán tử tạo lập cho Applet

- start(): đƣợc gọi khi Applet bắt đầu thực hiện, xuất hiện khi:

- stop(): đƣợc gọi khi Applet dừng thực hiện, nhƣng chƣa bị loại bỏ khỏi bộ nhớ

- destroy(): được gọi ngay trước khi Applet kết thúc, khi trình duyệt Web được đóng lại và Applet bị loại bỏ khỏi bộ nhớ

2.3.3 Chương trình ứng dụng dạng lai ghép

Java cho phép phát triển chương trình có thể chạy trên Web Browser (Applet) và dưới dạng ứng dụng độc lập (Application) Để xây dựng một chương trình như vậy, cần phải tuân thủ các bước và quy trình nhất định.

- Định nghĩa lớp ứng dụng kế thừa từ lớp Applet

- Trong lớp ứng dụng phải có hàm main()

Cấu trúc của tệp chương trình Java

Tệp chương trình Java có thể có các phần được đặc tả như sau:

Một gói (package) được định nghĩa thông qua tên gọi của nó, và tất cả các lớp và giao diện (interface) được khai báo trong tệp chứa gói này sẽ thuộc về gói đó Nếu không chỉ định gói, các định nghĩa trong tệp sẽ tự động thuộc về gói mặc định.

- Một số lệnh nhập import

- Một số định nghĩa lớp và interface có thể định nghĩa theo thứ tự bất kỳ, trong đó thường có một lớp public

Như vậy, cấu trúc của một tệp chương trình Java có thể khái quát như sau:

// Định nghĩa gói package Têngói;

// các gói cần sử dụng import java.io.*;

// Định nghĩa các lớp và các interface public class New{ } class C1 { } interface I1 { }

Sinh viên: Nguyễn Thị Hoàng - Khoa CNTT - ĐHDL Hải Phòng

LẬP TRÌNH SOCKET TCP

Định nghĩa

Socket là một điểm cuối trong kết nối giữa hai chương trình hoạt động trên mạng, với nhiều định nghĩa khác nhau tùy thuộc vào cách nhìn của người sử dụng.

Socket là phương pháp thiết lập kết nối truyền thông giữa chương trình yêu cầu dịch vụ (client) và chương trình cung cấp dịch vụ (server) trên mạng hoặc cùng một máy tính Đối với lập trình viên, socket được xem như một giao diện giữa tầng ứng dụng và các tầng khác trong mô hình mạng OSI, có nhiệm vụ thực hiện giao tiếp giữa chương trình ứng dụng và các tầng bên dưới của mạng.

Hình 3.1 Mô hình OSI dạng rút gọn

Hiện nay, lập trình viên thường bị hạn chế trong việc tạo socket riêng bằng tay, vì việc mở cổng một cách tường minh trong các ngôn ngữ như Java hay PHP là rất khó khăn Thay vào đó, họ thường sử dụng các thư viện socket có sẵn, giúp kết nối các ứng dụng mà không cần phải can thiệp vào các chi tiết phức tạp của socket Điều này cho phép các lập trình viên tập trung vào việc phát triển ứng dụng mà không phải lo lắng về các vấn đề kỹ thuật sâu xa liên quan đến socket.

Socket là một thực thể phần mềm có khả năng nhận và gửi dữ liệu giữa hai ứng dụng mạng Khi cần sử dụng, ứng dụng sẽ tạo socket, và khi không còn cần thiết, socket có thể được huỷ bỏ.

Một socket đƣợc định danh bằng một cặp giá trị:

- Địa chỉ IP của máy tính có chương trình ứng dụng đã tạo ra socket

- Số hiệu cổng (port) mà socket dùng để nhận/gửi dữ liệu

Cổng là số hiệu của một chương trình ứng dụng đang chạy trên máy tính, giúp hệ thống theo dõi các ứng dụng này Mỗi ứng dụng được gán một số cổng 16 bit, trong khoảng từ 0 đến 65535 Các số hiệu cổng từ 0 đến 1023 thường được sử dụng cho các dịch vụ hệ thống quan trọng.

1024 cổng) đã đƣợc dùng cho các dịch vụ nổi tiếng :

Hình 3.2 Số hiệu cổng của một số dịch vụ nổi tiếng

Nếu chúng ta không phải là người quản trị thì nên dùng từ cổng 1024 trở lên

Vậy socket = Địa chỉ IP + Số hiệu Port

Sinh viên: Nguyễn Thị Hoàng - Khoa CNTT - ĐHDL Hải Phòng

3.2 Mô hình clients/server sử dụng socket ở chế độ hướng kết nối TCP

Giai đoạn 1 : Server tạo socket, gán số hiệu cổng và lắng nghe yêu cầu kết nối

- socket(): Server yêu cầu tạo một socket để có thể sử dụng các dịch vụ của tầng vận chuyển

- bind(): Server yêu cầu gán số hiệu cổng (port) cho socket

- listen(): Server lắng nghe các yêu cầu kết nối từ clients trên cổng đã đƣợc gán

Server sẵn sàng phục vụ clients

Giai đoạn 2 : Clients tạo socket, yêu cầu thiết lập một kết nối tới server

Hàm socket() cho phép các client tạo một socket nhằm sử dụng các dịch vụ của tầng vận chuyển Thông thường, hệ thống sẽ tự động gán một số hiệu cổng còn trống cho socket của client.

- connect(): Clients gửi yêu cầu nối kết đến server có địa chỉ IP và Port xác định

Hàm accept() cho phép server chấp nhận kết nối từ clients, tạo ra một kênh giao tiếp ảo giữa chúng Qua kênh này, clients và server có thể trao đổi thông tin một cách hiệu quả.

Giai đoạn 3 : Trao đổi thông tin giữa clients và server

Sau khi chấp nhận yêu cầu kết nối, server thường thực hiện lệnh read() và sẽ chờ đợi cho đến khi nhận được thông điệp yêu cầu từ client.

- Server phân tích và thực thi yêu cầu, kết quả sẽ đƣợc gửi về clients bằng lệnh write()

- Sau khi gửi yêu cầu bằng lệnh write(), clients chờ nhận thông điệp kết quả

(Reply Message) từ server bằng lệnh read()

Giai đoạn 4 : Kết thúc phiên làm việc

- Các câu lệnh read(), write() có thể đƣợc thực hiện nhiều lần (ký hiệu bằng hình ellipse)

- Kênh ảo sẽ bị xóa khi server hoặc clients đóng socket bằng lệnh close()

Sinh viên: Nguyễn Thị Hoàng - Khoa CNTT - ĐHDL Hải Phòng

Nhƣ vậy toàn bộ quá trình diễn ra nhƣ sau :

Lập trình Socket TCP trong Java

Java cung cấp hỗ trợ lập trình mạng thông qua các lớp trong gói java.net Một số lớp tiêu biểu được sử dụng cho lập trình client/server với socket làm phương tiện giao tiếp bao gồm:

• InetAddress: Lớp này biểu diễn địa chỉ Internet, quan trọng nhất là hai phương thức getHostName() và getAddress() dùng để chuyển đổi giữa địa chỉ

IP và tên máy tính

• Socket: Hỗ trợ các phương thức liên quan đến socket cho chương trình clients ở chế độ hướng kết nối

• ServerSocket: Hỗ trợ các phương thức liên quan đến socket cho chương trình server ở chế độ hướng kết nối

• DatagramSocket: Hỗ trợ các phương thức liên quan đến socket ở chế độ không hướng kết nối cho cả clients và server

• DatagramPacket: Lớp cài đặt gói tin dạng thư tín người dùng trong giao tiếp giữa clients và server ở chế độ không hướng kết nối

3.3.1 Xây dựng chương trình clients ở chế độ hướng kết nối

1 Mở một socket kết nối đến server đã biết địa chỉ IP (hay tên miền) và số hiệu cổng

2 Lấy InputStream và OutputStream gán với socket

3 Tham khảo protocol của dịch vụ để định dạng đúng dữ liệu trao đổi với server

4 Trao đổi dữ liệu với server nhờ vào các InputStream và OutputStream

5 Đóng socket trước khi kết thúc chương trình

Lớp java.net.Socket cung cấp các phương thức cần thiết cho việc phát triển các chương trình client theo chế độ hướng kết nối Dưới đây là một số phương thức phổ biến được sử dụng để xây dựng các client hiệu quả.

The public Socket(String HostName, int PortNumber) throws IOException method is used to establish a connection to a server identified by HostName and PortNumber Upon a successful connection, a virtual channel is created between the client and the server.

+ HostName : địa chỉ IP hoặc tên logic theo dạng tên miền

+ PortNumber : có giá trị từ 0 đến 65535

Ví dụ: mở socket và kết nối đến Web Server của khoa công nghệ thông tin, đại học

Socket s = new Socket (www.cit.ctu.edu.vn,80); hoặc Socket s = new Socket(“203.162.36.149”,80);

- public InputStream getInputStream(): phương thức này trả về InputStream nối với socket Chương trình clients dùng InputStream này để nhận dữ liệu từ server gửi về

Ví dụ : lấy InputStream của socket s:

- public OutputStream getOutputStream(): phương thức này trả về OutputStream nối với socket Chương trình clients dùng OutputStream này để gửi dữ liệu cho server

Sinh viên: Nguyễn Thị Hoàng - Khoa CNTT - ĐHDL Hải Phòng

Ví dụ: Lấy OutputStream của socket s :

- public close(): phương thức này sẽ đóng socket lại, giải phóng kênh ảo, xoá kết nối giữa clients và server

Ví dụ : Đóng socket s : s.close();

3.3.2 Xây dựng chương trình server ở chế độ hướng kết nối

Lớp java.net.ServerSocket cung cấp các phương thức thiết yếu để phát triển các ứng dụng server sử dụng socket theo chế độ kết nối Dưới đây là một số phương thức phổ biến thường được sử dụng trong việc xây dựng server.

- public ServerSocket(int PortNumber : phương thức này tạo một socket với số hiệu cổng là PortNumber mà sau đó server sẽ lắng nghe trên cổng này

Ví dụ : tạo socket cho server với số hiệu cổng là 7 :

Phương thức public Socket accept() lắng nghe yêu cầu kết nối từ clients và hoạt động ở chế độ nghẽn, nghĩa là nó sẽ bị nghẽn cho đến khi nhận được yêu cầu kết nối Khi có yêu cầu từ clients, phương thức này sẽ chấp nhận và trả về một socket, tạo thành một đầu của kênh giao tiếp ảo giữa server và clients.

Ví dụ: Socket ss chờ nhận yêu cầu nối kết :

Server sau đó sẽ lấy InputStream và OutputStream của socket mới s để giao tiếp với clients

Xây dựng chương trình server phục vụ tuần tự

Một server có thể đƣợc cài đặt để phục vụ clients theo hai cách: phục vụ tuần tự hoặc phục vụ song song

Trong chế độ phục vụ tuần tự, server chỉ xử lý một yêu cầu kết nối tại một thời điểm, trong khi các yêu cầu kết nối từ các clients khác sẽ bị đưa vào hàng đợi và không được đáp ứng ngay lập tức.

Ngƣợc lại, trong chế độ phục vụ song song, tại một thời điểm server chấp nhận nhiều yêu cầu kết nối và phục vụ nhiều clients cùng lúc

Trong phần này, chúng ta sẽ khám phá chế độ phục vụ tuần tự của server, và trong chương tiếp theo, chúng ta sẽ đi sâu vào chế độ phục vụ song song sau khi đã nắm vững về Thread.

Các bước tổng quát của một server phục vụ tuần tự :

- Tạo socket và gán số hiệu cổng cho server

- Lắng nghe yêu cầu kết nối

- Với một yêu cầu kết nối được chấp nhận thực hiện các bước sau:

+ lấy InputStream và OutputStream gắn với socket của kênh ảo vừa đƣợc hình thành

+ lặp lại công việc sau:

Chờ nhận các yêu cầu (công việc)

Phân tích và thực hiện yêu cầu

Tạo thông điệp trả lời

Gửi thông điệp trả lời về clients

Nếu không còn yêu cầu hoặc clients kết thúc, đóng socket và quay lại bước2

Sinh viên: Nguyễn Thị Hoàng - Khoa CNTT - ĐHDL Hải Phòng

LUỒNG TRONG JAVA

Khái niệm luồng

- Luồng là một cách thông dụng để nâng cao năng lực xử lý của các ứng dụng nhờ vào cơ chế song song

- Một luồng là một đơn vị cơ bản của việc sử dụng CPU

- Nó hình thành gồm: một định danh luồng (thread ID), một bộ đếm chương trình, tập thanh ghi và ngăn xếp

Các luồng trong cùng một quá trình chia sẻ một không gian địa chỉ, cho phép chúng sử dụng các biến toàn cục và chia sẻ tài nguyên một cách hiệu quả.

- Cách thức các luồng chia sẻ CPU cũng giống nhƣ cách thức của các quá trình

Một luồng trong hệ thống có các trạng thái khác nhau như đang chạy (running), sẵn sàng (ready), nghẽn (blocked) và kết thúc (dead) Được coi là một quá trình nhẹ, luồng giúp tối ưu hóa hiệu suất và quản lý tài nguyên trong lập trình.

Trong bài viết này, chúng ta sẽ khám phá khái niệm về server phục vụ song song, tiếp nối từ những bước tổng quát đã được trình bày trong chương trước về server phục vụ tuần tự.

Nhờ vào luồng, người ta thiết kế các server có thể đáp ứng nhiều yêu cầu một cách đồng thời

Các bước tổng quát của một server phục vụ song song

Server phục vụ song song gồm hai phần thực hiện song song nhau:

Hình 4.1 Server ở chế độ song song

Trong mô hình server này, có một luồng phân phát (Dispatcher thread) và nhiều luồng thực hiện (Worker Thread) Luồng phân phát nhận yêu cầu kết nối từ clients và phân phối chúng cho các luồng thực hiện đang rảnh rỗi để xử lý Các luồng thực hiện hoạt động song song với nhau và với luồng phân phát, giúp server phục vụ nhiều client đồng thời một cách hiệu quả.

- Phần 1 ( Dispatcher thread ): Xử lý các yêu cầu kết nối, lặp lại các công việc sau: + Lắng nghe yêu cầu kết nối của clients

+ Chấp nhận một yêu cầu kết nối

Tạo kênh giao tiếp ảo mới với clients

Tạo phần 2 để xử lý các thông điệp yêu cầu của clients

- Phần 2 (Worker Thread): Xử lý các thông điệp yêu cầu từ clients, lặp lại các công việc sau:

+ Chờ nhận thông điệp yêu cầu của clients

+ Phân tích và xử lý yêu cầu

+ Gửi thông điệp trả lời cho clients

Phần 2 sẽ kết thúc khi kênh ảo bị xóa đi

Sinh viên: Nguyễn Thị Hoàng - Khoa CNTT - ĐHDL Hải Phòng

Mỗi client trên server sẽ có một Phần 2 để xử lý yêu cầu, vì vậy tại bất kỳ thời điểm nào, luôn có một Phần 1 và 0 hoặc nhiều Phần 2 tồn tại đồng thời.

Do phần 2 thực thi song song với phần 1 cho nên nó đƣợc thiết kế là một thread

- Nhìn từ góc độ hệ điều hành, luồng có thể đƣợc cài đặt ở một trong hai mức:

• Trong không gian người dùng (user space)

• Trong không gian nhân (kernel mode)

4.1.1 Tiếp cận luồng ở mức người dùng

Hình 4.2 Kiến trúc luồng cài đặt ở mức người dùng

Không gian người dùng bao gồm một hệ thống runtime quản lý các thủ tục luồng Các luồng hoạt động trong không gian này được hệ thống runtime giám sát Hệ thống cũng duy trì một bảng tin trạng thái để theo dõi tình trạng hiện tại của từng luồng.

Mỗi luồng sẽ tương ứng với một mục trong bảng, cung cấp thông tin về trạng thái, giá trị thanh ghi, độ ưu tiên và các thông tin khác liên quan đến luồng.

Cách tiếp cận này bao gồm hai mức định thời biểu: một cho các quá trình nặng và một cho hệ thống runtime Bộ lập biểu của hệ thống runtime phân chia thời gian CPU của một quá trình thành các khoảng nhỏ hơn để cấp cho các luồng trong quá trình đó Do đó, việc kết thúc một luồng trở nên vượt ra ngoài tầm kiểm soát của kernel hệ thống.

4.1.2 Tiếp cận luồng ở mức hạt nhân hệ điều hành

Hình 4.3 Kiến trúc luồng cài đặt ở mức hệ thống

Trong phương pháp này, không có hệ thống runtime, và các luồng được quản lý bởi kernel của hệ điều hành Tất cả thông tin trạng thái của các luồng được lưu trữ trong kernel, và khi một luồng bị nghẽn, kernel sẽ bẫy (TRAP) các lời gọi đó Khi một luồng bị ngừng hoạt động, kernel sẽ chọn một luồng khác để thực thi, có thể là trong cùng một quá trình hoặc từ một quá trình khác Do đó, kernel luôn biết về sự tồn tại của các luồng trong hệ thống, với chỉ một mức lập biểu.

Luồng trong Java

Trong Java, luồng được định nghĩa là một đối tượng thuộc lớp java.lang.Thread Để cài đặt luồng trong chương trình Java, bạn có thể tạo một lớp con từ lớp java.lang.Thread hoặc thực hiện giao diện java.lang.Runnable.

4.2.1 Các phương pháp thực hiện luồng

Java cho phép xây dựng các ứng dụng đa luồng, trong đó mỗi luồng thực hiện một nhiệm vụ cụ thể và hoạt động đồng thời với các luồng khác.

Có 2 cách để tạo ra luồng :

- Cách 1 : Thừa kế từ lớp java.lang.Thread

Sinh viên: Nguyễn Thị Hoàng - Khoa CNTT - ĐHDL Hải Phòng

- Cách 2 : Cài đặt giao diện java.lang.Runnable

Lớp Thread cung cấp phương thức khởi tạo Thread() cùng với nhiều chức năng hữu ích để quản lý luồng như chạy, khởi động, tạm ngừng, tiếp tục, gián đoạn và dừng luồng Để tạo và chạy một luồng, chúng ta cần thực hiện hai bước cơ bản.

- Mở rộng lớp Thread và viết đè phương thức run()

- Gọi phương thức start() để luồng bắt đầu thực thi

Trong Java, luồng thực thi được quản lý thông qua một số phương thức quan trọng Phương thức `run()` cần được ghi đè để thực hiện nhiệm vụ của luồng, vì phương thức này trong lớp `Thread` chỉ là rỗng Để khởi động luồng, phương thức `start()` phải được gọi, kích hoạt phương thức `run()` Phương thức `stop()` ngừng luồng nhưng không an toàn, do đó nên gán giá trị null cho biến Thread thay vì sử dụng nó Tương tự, phương thức `suspend()` tạm ngừng luồng nhưng không giải phóng tài nguyên, có thể dẫn đến deadlock, nên `wait()` là lựa chọn tốt hơn Phương thức `resume()` tiếp tục luồng đã bị tạm ngưng, nhưng nên dùng `notify()` để thay thế Phương thức tĩnh `sleep(long millis)` đặt luồng vào trạng thái ngủ trong khoảng thời gian xác định Phương thức `interrupt()` làm gián đoạn luồng, trong khi `isInterrupt()` kiểm tra trạng thái ngắt Độ ưu tiên của luồng được thiết lập bằng `setPriority(int p)` với giá trị từ 1 đến 10 Phương thức `wait()` đưa luồng vào trạng thái chờ cho đến khi được thông báo, và `notify()` hoặc `notifyAll()` sẽ đánh thức các luồng đang chờ Cuối cùng, phương thức `isAlive()` kiểm tra xem luồng còn tồn tại hay không, và `getPriority()` trả về mức ưu tiên của luồng.

Ví dụ : tạo ra hai luồng thi hành song song, một luồng thực hiện việc in 200 dòng

Đại học Dân lập Hải Phòng đang thực hiện một chương trình mới, trong khi đó, một luồng khác vẫn tiếp tục in 200 dòng chữ "Chào mừng bạn đến với Java".

//======================== import java.net.* ; import java.io.* ; public class Hello

{ public static void main ( String[] args )

{ new ChaoDH ().start (); new ChaoJV ().start ();

Sinh viên: Nguyễn Thị Hoàng - Khoa CNTT - ĐHDL Hải Phòng class ChaoDH extends Thread

System.out.println("Dai hoc dan lap Hai Phong \n"); }

System.out.println ( "\t chao mung ban den voi Java.\n" );

//========================Khi ta chạy chương trình sẽ thấy các kết quả xen kẽ nhau

Java không hỗ trợ kế thừa bội, do đó khi bạn cần kế thừa từ một lớp và đồng thời thực hiện đa luồng, bạn phải sử dụng giao diện Runnable Ví dụ, khi phát triển các applet, nếu bạn muốn vừa kế thừa từ lớp Applet vừa thực thi nhiều luồng, bạn sẽ gặp phải giới hạn, vì sau khi kế thừa từ lớp Applet, bạn không thể kế thừa từ lớp Thread.

Trong ví dụ này, chúng ta sẽ viết lại mà không kế thừa lớp Thread, thay vào đó, chúng ta sẽ triển khai giao diện Runnable Dưới đây là đoạn mã mẫu: ```javaimport java.net.*; import java.io.*; public class hello2 { // Nội dung của lớp sẽ được triển khai ở đây}```

{ public static void main(String[] args)

Thread t = new Thread (new ChaoDH()); t.start();

Thread t1 = new Thread (new ChaoJV()); t1.start ();

Sinh viên: Nguyễn Thị Hoàng - Khoa CNTT - ĐHDL Hải Phòng

ChaoDH thu = new ChaoDH(); for ( int i = 1; i

Ngày đăng: 05/08/2021, 21:56

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w