20. Sử dụng Java Awt và Java Applet viết chương trình vẽ biểu đồ hình tròn theo mẫu ở hình sau:
21. Sử dụng Java Awt, Java Applet và các sự kiện chuột MouseListener viết chương trình vẽ 4 hình vuông theo mẫu sau, sao cho khi kích chuột lên hình vuông nào đó thì nó sẽ đổi màu ngẫu nhiên.
22. Sử dụng Java Awt, Java Applet và các sự kiện chuột MouseListener viết chương trình vẽ hình mặt người theo mẫu ở hình dưới, sao cho khi kích chuộtlên Smile thì hình mặt người là smile (Nền màu vàng và miệng cười), kích chuột lên Sad thì hình sad(Nền màu nâu, miệng méo).
23. Sử dụng Java Awt, Java Applet vẽ ra màn hình 20 dòng chữ Java tạo thành vòng tròn có màu biến thiên dần từ đỏ sang xanh theo mẫu ở hình sau:
24. Sử dụng Java Awt, Java Applet vẽ bia bắn (là các đường tròn đồng tâm màu đỏ và trắng) theo mẫu ở hình sau:
25. Sử dụng Java Awt, Java Applet, viết chương trình vẽ các đoạn thẳng màu xanh trên nền trắng quanh một tâm cố định theo mẫu ở hình sau:
26. Sử dụng Java Awt, Java Applet, viết chương trình vẽ các hình chữ nhật màu hồng trên nền trắng theo mẫu ở hình sau:
27. Sử dụng Java Awt, Java Applet, viết chương trình vẽ bàn cờ vua các ô màu đỏ và đen theo mẫu ở hình sau:
CHƯƠNG 6: LẬP TRÌNH ĐA LUỒNG
6.1. Giới thiệu về lập trình luồng
Luồng là một thuộc tính duy nhất của Java. Nó là đơn vị nhỏ nhất của đoạn mã có thể thi hành được để thực hiện một công việc nhất định. Ngôn ngữ Java, máy ảo Java cả hai đều là các hệ thống phân luồng
6.2. Luồng và đa luồng
Java hỗ trợ đa luồng, nó có khả năng làm việc với nhiều luồng. Một ứng dụng có thể bao hàm nhiều luồng. Mỗi luồng được gán một công việc cụ thể, chúng được thực thi đồng thời với các luồng khác.
Đa luồng làm giảm tối đa thời gian nhàn rỗi của hệ thống. Điều này cho phép bạn viết các chương trình có hiệu quả cao với sự tận dụng tối đa CPU. Mỗi phần của
chương trình được gọi một luồng, mỗi luồng định nghĩa một cách thực hiện. Đây là một trường hợp đặc biệt của đa nhiệm.
Trong đa nhiệm, nhiều chương trình chạy đồng thời, mỗi chương trình có ít nhất một luồng trong nó. Một bộ vi xử lý thực thi tất cả các chương trình này. Qua đó chương trình được thực thi như là đồng thời, trên thực tế bộ vi xử lý chuyển qua chuyển lại giữa các chương trình.
6.3. Tạo và quản lý luồng
Khi các chương trình Java được thực thi, luồng chính đã đang được thực hiện.
Hai yếu tố quan trong luồng chính (main) là:
Các luồng con sẽ được tạo ra từ nó.
Nó là luồng cuối cùng kết thúc việc thực hiện. Ngay khi luồng chính ngừng thực thi, chương trình bị chấm dứ t.
Cho dù luồng chính được tạo ra một cách tự động với chương trình thực thi, nó có thể được điều khiển thông qua một đối tượng luồng.
Các luồng có thể được tạo ra từ hai cách:
Khai báo lớp là lớp con của lớp Thread, và phương thức run() của lớp Thread cần được định nghĩa đè.
Ví dụ 6.1: Tạo một lớp con của lớp Thread
class Mydemo extends Thread
{
public void run()
{
//thực thi
}
}
Khai báo lớp cài đặt giao diện Runnable. Rồi thì định nghĩa phương thức run().
class MyDemo implements Runnable
{
public void run()
{
//thực thi
}
}
Ví dụ 6.2:Chỉ ra sự điều khiển luồng chính như thế nào
import java.io.*;
public class Mythread extends Thread
{
public static void main(String args[])
{
Thread t = Thread.currentThread(); System.out.println("The current Thread is :" + t); t.setName("MyJavaThread"); System.out.println("The thread is now named: " + t); try{
for(int i = 0; i <3;i++)
{
System.out.println(i); Thread.sleep(1500);
}
}
catch(InterruptedException e)
{
System.out.println("Main thread interupted");
}
}
}
Hình sau đây sẽ chỉ ra kết quả xuất ra màn hình của chương trình trên
Hình 6.1. Kết quả thực hiện ví dụ 6.2
Trong kết quả xuất ra ở trên
[main, 5 , main]
Nhóm luồng mà nó phụ thuộc vào
Quyền ưu tiên được đặt bởi JVM
Tên của luồng
Mỗi luồng trong chương trình Java được cấp một quyền ưu tiên. Máy ảo Java không bao giờ thay đổi quyền ưu tiên của luồng. Quyền ưu tiên vẫn còn là hằng số cho đến khi luồng bị ngắt.
Mỗi luồng có một giá trị ưu tiên nằm trong khoảng của một Thread.MIN_PRIORITY (=1), và đến Thread.MAX_PRIORITY (=10). Mỗi luồng thuộc vào một nhóm luồng, và mỗi nhóm luồng có quyền ưu tiên của chính nó. Mỗi luồng có một giá trị ưu tiên mặc định Thread.NORM_PRIORITY là 5. Luồng mới thừa kế quyền ưu tiên của luồng mà tạo ra nó.
Lớp Thread có vài phương thức khởi tạo, hai trong số các phương thức khởi dựng được đề cập đến dưới đây:
public Thread(String threadname)
Cấu trúc một luồng với tên là “threadname”
public Thread()
Cấu trúc một luồng với tên “Thread, gép với một số; ví dụ Thread-1, Thread-2, v.v…
Chương trình bắt đầu thực thi luồng với việc gọi phương thức start() của lớp Thread. Phương thức này sẽ gọi phương thức run(), nơi định nghĩa công việc được
thực thi. Phương thức này có thể được định nghĩa đè trong lớp con của lớp Thread, hoặc trong đối tượng cài đặt giao diện Runnable.
6.4. Vòng đời của luồng
Hình 6.2. Vòng đời của luồng
6.5. Trạng thái của luồng và các phương thức của lớp Thread
Một luồng vừa được tạo ra có trạng thái 'born'. Luồng không bắt đầu chạy ngay lập tức sau khi nó được tạo ra. Nó đợi phương thức start() của chính nó được gọi. từ đó nó ở trạng thái “sẵn sàng để chạy”. Luồng đi vào trạng thái “đang chay” khi hệ thống cấp quyền sử dụng bộ vi xử lý cho nó.
Có thể sử dụng phương thức sleep() để tạm thời dừng sự thực thi của luồng. Luồng trở thành sẵn sàng sau khi phương thức sleep() kết thúc. Luồng khi rơi vào trạng thái 'ngủ' (sleeping) không sử dụng bộ vi xử lý. Luồng đi vào trạng thái “đợi" (waiting) khi một luồng gọi phương thức wait().
Khi các luồng khác sử dụng xong đối tượng, gọi phương thức notify(), luồng trở lại trạng thái “sẵn sàng" (ready). Luồng đi vào trạng thái “blocked” khi nó đang thực thi các phép toán vào/ra (Input/output). Nó đi vào trạng thái "sẵn sàng" khi các phương thức vào/ra nó đang đợi được hoàn thành. Luồng đi vào trạng thái “chết” (dead) sau khi phương thức run() đã được thực thi xong, hoặc khi phương thức stop() của nó được gọi.
Bên cạnh các phương thức đã được đề cập ở trên, lớp Thread còn có các phương thức sau:
Mục đích | |
enumerate(Thread t) | Sao chép tất cả các luồng hiện hành vào mảng được chỉ |
Có thể bạn quan tâm!
- Lập trình Java - 27
- Lập trình Java - 28
- Lập trình Java - 29
- Kết Quả Hiển Thị Của Ví Dụ 6.5 Không Có Sự Đồng Bộ
- Lập trình Java - 32
- Lập trình Java - 33
Xem toàn bộ 267 trang tài liệu này.
định từ nhóm luồng, và các nhóm con của nó. | |
getName() | Trả về tên của luồng |
isAlive() | Trả về True, nếu luồng là vẫn còn tồn tại (sống) |
getPriority() | Trả về mức ưu tiên của luồng |
setName(String name) | Đặt tên cho luồng. |
join() | Đợi cho đến khi luồng chết. |
isDaemon() | Kiểm tra nếu luồng là luồng một luồng chạy ngầm (deamon) |
setDeamon(boolean on) | Đánh dấu luồng như là luồng chạy ngầm hoặc |
resume() | Tiếp tục thực hiện từ trạng thái treo |
sleep() | Dừng thực thi luồng một khoảng thời gian. |
start() | Gọi phương thức run() để bắt đầu một luồng. |
Bảng 6.1. Các phương thức của một lớp luồng
Điều phối round-robin đề cập đến các luồng với cùng mức ưu tiên. Khi các luồng cùng mức ưu tiên thực thi cùng một thời điểm thì phương pháp chia sẻ thời gian sử dụng bộ vi xử lý round-robin tự động được áp dụng.
Phiên bản mới nhất của Java không hỗ trợ các phương thức Thread.suspend() (treo), Thread.resume() (trở lại) và Thread.stop() (dừng), vì các phương thức tạo ra nguy cơ khoá chết (deadlock).
6.6. Thời gian biểu luồng
Hầu hết các chương trình Java là đa luồng. Nhưng CPU chỉ có khả năng thực thi một luồng tại một thời điểm. Khi có nhiều hơn một luồng có cùng mức ưu tiên thực thi trong cùng một thời điểm thì người lập trình, hoặc máy ảo Java, hoặc hệ điều hành đảm bảo rằng CPU được chia sẻ giữa chúng. Điều này được gọi là điều khiển luồng (thời gian biểu luồng).
Không có máy ảo Java nào có cơ chế cụ thể cho việc điều khiển luồng. Một số môi trường Java hỗ trợ việc chia nhỏ thời gian. Ở đây, mỗi luồng nhận một phần nhỏ của thời gian bộ vi xử lý, được gọi là định lượng (quantum). Luồng có thể thực thi tác vụ của chính nó trong suốt khoảng thời gian được cấp. Sau khoảng thời gian này, luồng phải tạm dừng thực hiện, ngay cả khi nó chưa hoàn thành. Luồng kế tiếp có cùng quyền ưu tiên sẽ sử dụng bộ vi xử lý trong khoảng thời tiếp theo. Java điều khiển việc chia nhỏ thời gian giữa tất cả các luồng có cùng mức ưu tiên.