Giới thiệu về Threads
Bài 07
Bài 07 2 / 22
Nội dung chính
Định nghĩa threads
Định nghĩa về multithreading
Lợi ích của multithreading
Tạo threads
Thảo luận về trạng thái của Threads
Quản lý threads
Thiết lập thuộc tính cho threads
Tìm hiểu về daemon thread
Bài 07 3 / 22
Multitasking & Multithreading
Multitasking là khả năng chạy 1 or nhiều chương
trình cùng lúc.
Operating system sẽ điều khiển bằng cách lập lịch
cho các chương trình đó.
Multithreading là khả năng thực hiện các phần
khác nhau của một chương trình một cách độc lập
nhau.
Bài 07 4 / 22
Thread
Thread là một đoạn mã nhỏ nhất mà có thể thực thi
được, nó thực thi một nhiệm vụ cụ thể nào đó.
Một ứng dụng có thể chia làm nhiều nhiệm vụ, mỗi
nhiệm vụ có thể gán cho một thread
Nhiều thread cùng thực hiện đồng thời, gọi là
Multithreading.
Các thread có vẻ như thực hiện đồng thời, nhưng
thực tế ko phải vậy…
Bài 07 5 / 22
Ưu điểm của Multithreading
Multithreading có chi phí thấp hơn multitasking (về
không gian, t/g)
Trong multitasking, các tiến trình chạy trên các địa chỉ riêng
biệt
Các thread trong multithreading có thể chia sẻ cùng không
gian bộ nhớ.
Các tiến trình trong multitasking gọi nhau phải chịu
chi phí lơn hơn các thread trong multithreading.
Multithreading cho phép chúng ta thiết kế chương
trình hiệu quả hơn mà sử dụng ít tài nguyên CPU
Multithreading còn cho phép chúng ta điều khiển cho
các thread sleep một t/g trong khi các thread khác
vẫn hoạt động mà ko làm cho hệ thống bị pause.
Bài 07 6 / 22
ứng dụng của thread
Tính toán 2 phép tính đồng thời
Vừa nghe nhạc, vừa xem ảnh đồng thời
Hiển thị cùng lúc nhiều ảnh trên màn hình
Bài 07 7 / 22
Tạo threads
Chương trình sẽ bị ngắt quãng khi thread main bị stop.
Main thread có thể được điều khiển thông qua đối tượng
thread.
Tham chiếu đến main thread có thể nhận được bằng cách gọi
method currentThread() của lớp Thread.
Khi chương trình java thực hiện thì luôn có
một thread chạy đó là thread
main
Bài 07 8 / 22
Tạo thread
Đối tượng thread có thể được tạo theo 2 cách:
Định nghĩa một lớp là lớp con của lớp Thread được
định nghĩa trong gói java.lang
class mythread extends Thread
Định nghĩa một lớp là implements của Runnable
interface.
class mythread implements Runnable
Bài 07 9 / 22
Tạo thread
Khi phương thức start() được gọi, thì tài nguyên
hệ thống sẽ được cấp phát cho thread đó và nó sẽ
được lập lịch để chạy.
Sau đó phải gọi phương thức run()
Sau khi một thread mới được khởi tạo, chúng
ta có thể gọi phương thức start()để start
một thread, trái lại nó sẽ là một đối tượng
thread rỗng, ko được cấp phát tài nguyên.
Mythread t = new Mythread();
t.start();
Bài 07 10 / 22
public void run()
{
while(true)
{
try
{
System.out.println("This is the child thread");
Thread.sleep(500);
}
catch(InterruptedException e)
{ }
}
}
}
Tạo thread
Ví dụ
Tạo một thread bằng cách kế thừa lớp Thread.
class MyThread extends Thread
{
public static void main(String args[])
{
MyThread Objex = new MyThread();
Objex.create();
System.out.println("This is the main thread");
}
public void create()
{
Thread Objth = new Thread(this);
Objth.start();
}
Output
Bài 07 11 / 22
Tạo thread
ví dụ 2:
Tạo thread từ việc implement Runnable interface
class MyThread2 implements Runnable
{
public static void main(String args[])
{
MyThread2 Objx = new MyThread2();
Objx.create();
System.out.println("This is the main thread");
}
public void create()
{
Thread Objth = new Thread(this);
Objth.start();
}
public void run()
{
while(true)
{
try
{
System.out.println("This is the child thread");
Thread.sleep(500);
}
catch(InterruptedException e)
{ }
}
}
}
Output
Bài 07 12 / 22
Trạng thái của Thread
Born: một thread vừa được tạo ra thì nó ở
trạng thái
born
.
Ready: Sau khi thread được tạo, nó ở trạng
thái sẵn sàng đợi phương thức start()
được gọi.
Bài 07 13 / 22
Trạng thái của thread
Running: Thread ở trạng thái running khi phương
thực start đã được gọi
Sleeping: thread đang hoạt động cũng có thể
bị ngắt quãng bằng cách gọi phương thức
sleep(). Thread sẽ chuyển sang trạng thái
sleeping một khoảng thời gian.
Bài 07 14 / 22
Trạng thái của thread
Waiting: Thread sẽ ở trạng thái này khi
phương thức wait() được gọi. Nó được sử
dụng khi 2 hay nhiều thread chạy cùng nhau.
Blocked: thread rơi vào trạng thái này khi
nó đợi dữ liệu như thao tác input/output.
Dead: thread rơi vào trạng thái này khi
phương thức run() kết thúc hoặc phương
thức stop() được gọi.
Bài 07 15 / 22
Các trạng thái của thread
New Thread
(BORN)
READY
RUNNING
DEAD
SLEEPING
WAITING BLOCKED
Bài 07 16 / 22
Một số method của lớp thread
final boolean isAlive(): trả về giá trị true nếu
thread còn tồn tại
final String getName(): trả về tên của thread.
void start():
Bài 07 17 / 22
Một số method của lớp thread
final void join() throws
InterruptedException: đợi cho đến khi thread
die.
static void yield(): thread hiện tại sẽ tạm
ngừng để thread khác chạy.
final void setName(String name):
Bài 07 18 / 22
Một số method của lớp thread
final boolean isDaemon(): kiểm tra xem có
phải là Daemon thread ko.
static int activeCount(): đếm số thread
đang hoạt động
static void sleep():
Bài 07 19 / 22
Thread có thể được xét mức ưu tiên khác nhau (là
các hằng của lớp Thread)
NORM_PRIORITY – value is
MAX_PRIORITY – value is
MIN_PRIORITY – value is
Quản lý thread
Giá trị mặc định là: NORM_PRIORITY
2 phương thức để thiết lập priority:
final void setPriority(int newp):
thay đổi mức ưu tiên hiện tại
final int getPriority(): trả về mức ưu
tiên.
Bài 07 20 / 22
Daemon threads
2 loại thread trong java:
User threads: đc tạo bởi người dùng
Daemon threads: các thread làm việc dưới background và
nó cung cấp dịch vụ cho các thread khác.
Ví dụ: – the garbage collector thread
Khi thread của người dùng thoát, JVM sẽ kiểm tra
xem còn các thread nào đang chạy ko?
Nếu có thì nó sẽ lập lịch cho các thread đó
Nếu chỉ có Daemon thread hoạt động thì nó sẽ
thoát.
Bài 07 21 / 22
Daemon threads
Chúng ta cũng có thể thiết lập cho một thread là
Daemon thread nếu muốn chương trình chính đợi cho
đến khi thread kết thúc.
Thread có 2 phương thức để làm việc với Daemon
thread:
public final void setDaemon(boolean value) : Gán
một Thread thành Daemon thread
public final boolean isDaemon() : Kiểm tra xem 1
thread có phải là Daemon thread ko?
Bài 07 22 / 22
Daemon threads
An example
class TestDaemon implements Runnable
{
Thread Objth1,Objth2;
public TestDaemon()
{
Objth1 = new Thread(this);
Objth1.start();
Objth2 = new Thread(this);
Objth2.setDaemon(true);
}
public void run()
{
System.out.println(Thread.activeCount());
System.out.println(Objth1.isDaemon());
System.out.println(Objth2.isDaemon());
}
public static void main(String args[])
{
new TestDaemon();
}
}
Output
Bài 07 23 / 22
MultiThreading
Một chương trình có nhiều tuyến cùng chạy đồng thời,
các tuyến dùng chung vùng dữ liệu của chương trình.
Điều phối giữa các tuyến:
Các luồng có quyền ưu tiên cao hơn có cơ hội nhận thời gian
sử dụng CPU để hoàn thành trước các luồng ưu tiên thấp
hơn.
Khi một luồng đang được chạy, luồng có quyền ưu tiên cao
hơn có thể giành quyền sử dụng CPU (cơ chế lập lịch của
JVM)
Nếu các luồng có quyền ưu tiên như nhau thì một luồng bất
kì sẽ được lựa chọn.
Bài 07 24 / 22
MultiThreading
Điều phối giữa các tuyến:
Khi một luồng giành quyền sử dụng CPU thì nó sẽ thực hiện
cho đến khi một trong các sự kiện sau:
Phương thức run() kết thúc.
Một luồng có quyền ưu tiên cao hơn.
Nó gọi sleep() or yield()-nhượng bộ
Khi gọi yield() luồng sẽ đưa cho các luồng khác cùng quyền
ưu tiên cơ hội sử dụng CPU, nếu không có luồng nào khác
cùng quyền ưu tiên tồn tại thì nó sẽ thực hiện tiếp.
Khi gọi sleep() luồng sẽ ngủ một khoảng thời gian mili-
seconds, khi đó bất kì một luồng nào khác cũng có thể sử
dụng CPU
Bài 07 25 / 22
Một số phương thức của thread
Phương thức join():
Khi một luồng (A) gọi phương thức join() của một luồng nào
đó (B), luồng hiện hành (A) sẽ bị khóa chờ (blocked) cho đến
khi luồng đó kết thúc (B).
Phương thức interrupt():
Đặt trạng thái luồng ngắt (không ngừng hẳn luồng).
Phương thức interrupted()
Phương thức này trả lại một giá trị boolean cho biết trạng
thái ngắt quãng của luồng hiện thời.
Phương thức này cũng đặt lại trạng thái của luồng hiện thời
thành không ngắt.