Tải bản đầy đủ (.ppt) (34 trang)

Bài 7: Giới thiệu vềThreads pptx

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (490.38 KB, 34 trang )

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.

×