Tài liệu JAVA-8 - Pdf 85

41
A TUYN
Mc tiêu:
Sau khi kt thúc ching này, bn có th:
 nh ngha mt lung
 Mô t đa tuyn
 To và qun lý lung
 Hiu đc vòng đi ca lung
 Mô t mt lung him
 Gii thích tp hp các lung u tiên nh th nào
 Gii thích đc s cn thit ca s đng b
 Hiu đc cách thêm vào các t khoá synchronized (đng b) nh th
nào
 Lit kê nhng điu không thun li ca s đng b
 Gii thích vai trò ca các phng thc wait() (đi), notify() (thông
báo) và notifyAll().
 Mô t mt điu kin b tc (deadlock).
1. Gii thiu
Mt 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 mà thc hin mt công vic riêng bit. Ngôn ng Java và máy o
Java c hai là các h thng đc phân lung
2. a tuyn
Java h tr đa tuyn, mà 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 đng ký mt công vic riêng bit, mà chúng
đc thc thi đng thi vi các lung khác.
a tuyn gi thi gian nhàn ri ca h thng thành nh nht. 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 CPU là ti đa. 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 đng dn khác nhau ca s
thc hin. ây là mt thit k chuyên dùng ca s đa nhim.
Trong s đa nhim, nhiu chng 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 vi x lý thc thi tt c các chng trình. Cho dù nó có

}
}
Chng trình 8.1 s ch ra s điu khin lung chính nh th nào
Chng trình 8.1
import java.io.*;
public class Mythread extends Thread{
/**
* Mythread constructor comment.
*/
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
43

Hình 8.1 Lung
Trong kt qu xut ra  trên


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
44

Hình 8.3 Vòng đi ca lung
5. Phm vi ca lung và các phng thc ca lp lung
Mt lung đã đc to mi gn đây là trong phm vi “sinh”. 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. Cho đn khi, nó là trong phm vi “sn sàng đ chy”. Lung đi vào phm vi
“đang chay” khi h thng đnh rõ v trí lung trong b vi x lý.
Bn có th s dng phng thc sleep() đ tm thi treo 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 thi gian. Lung Sleeping
không s dng b vi x lý. lung đi vào phm vi “waiting” (đi) khi mt lung đang
chy gi phng thc wait() (đi).
Khi các lung khác liên kt vi các đi tng, gi phng thc notify(), lung đi
vào tr li phm vi “ready” (sn sàng) Lung đi vào phm vi “blocked” (khi) khi nó
đang thc thi các phép toán vào/ra (Input/output). Nó đi vào phm vi “ready” (sn sàng)
khi các phng thc vào/ra nó đang đi cho đn khi đc hoàn thành. Lung đi vào
phm vi “dead” (cht) sau khi phng thc run() đã đc thc thi hoàn toàn, hoc khi
phng thc stop() (dng) ca nó đc gi.
Thêm vào các phng thc đã đc đ cp trên, Lp lung cng có các phng
thc sau:
Phng thc 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
đnh t nhóm ca các lung, và các nhóm con ca nó.
getName() Tr v tên ca lung
isAlive() Tr v úng, nu lung là vn còn tn ti (sng)
getPriority() Tr v quyn u tiên ca lung
setName(String name) t tên ca lung là tên mà lung đc truyn nh là

Phng thc setPriority() ly mt s nguyên (integer) nh là mt tham s có th
hiu chnh quyn u tiên ca mt lung. ây là giá tr có phm vi thay đi t 1 đn 10,
mc khác, phng thc đa ra mt ngoi l (by li) đc gi là
IllegalArgumentException (Chp nhn tham s trái lut)
Phng thc yield() (li nhun) đa ra các lung khác mt kh nng đ thc thi.
Phng thc này đc thích hp cho các h thng không chia nh thi gian (non-time-
sliced), ni mà các lung hin thi hoàn thành vic thc hin trc khi các lung có
quyn u tiên ngang nhau k tip tip qun.  đây, bn s gi phng thc yield() ti
nhng khon thi gian riêng bit đ có th tt c các lung có quyn u tiên ngang nhau
chia s thi gian thc thi CPU.
Chng trình 8.2 chng minh quyn u tiên ca lung:
Chng trình 8.2
class PriorityDemo {
Priority t1,t2,t3;
public PriorityDemo(){
t1 = new Priority();
t1.start();
t2 = new Priority();
t2.start();
t3 = new Priority();
t3.start();
}
public static void main(String args[]){
46
new PriorityDemo();
}
class Priority extends Thread implements Runnable{
int sleep;
int prio = 3;
public Priority(){

lm nhng d liu vô ngha - dn rác). Lung dn rác thc thi ch khi h thng không
có tác v nào. Nó là mt lung có quyn u tiên thp. Lp lung có hai phng thc đ
tha thun vi các lung him:
 public void setDaemon(boolean on)
 public boolean isDaemon()
8. a tuyn vi Applets
Trong khi đa tuyn là rt hu dng trong các chng trình ng dng đc lp, nó
cng đáng đc quan tâm vi các ng dng trên Web. a tuyn đc s dng trên web,
cho ví d, trong các trò chi đa phng tin, các bc nh đy sinh khí, hin th các dòng
ch chy qua li trên biu ng, hin th đng h thi gian nh là mt phn ca trang Web
v.vv… Các chc nng này cu thành các trang web làm quyn r và bt mt.
Chng trình Java da trên Applet thng s dng nhiu hn mt lung. Trong
đa tuyn vi Applet, lp java.applet.Applet là lp con đc to ra bi ngi s dng đnh
ngha applet. T đó, Java không h tr nhiu k tha vi các lp, nó không th thc hin
đc trc tip lp con ca lp lung trong các applet. Tuy nhiên, chúng ta s dng mt
đi tng ca lung ngi s dng đã đnh ngha, mà các lung này, ln lt, dn xut t
lp lung. Mt lung đn gin xut hin s đc thc thi ti giao din (Interface)
Runnable
Chng trình 8.3 ch ra điu này thc thi nh th nào:
Chng trình 8.3
import java.awt.*;
import java.applet.*;
public class Myapplet extends Applet implements Runnable {
int i;
Thread t;
/**
* Myapplet constructor comment.
*/
public void init(){
t = new Thread(this);

9. Nhóm lung
Mt lp nhóm lung (ThreadGroup) nm bt mt nhóm ca các lung. Ly ví d,
mt nhóm lung trong mt trình duyt có th qun lý tt c các lung ph thuc vào mt
đn th applet. Tt c các lung trong máy o Java ph thuc vào các nhóm lung mc
đnh. Mi nhóm lung có mt nhóm ngun cha. Vì th, các nhóm t mt cu trúc dng
cây. Nhóm lung “h thng” là gc ca tt c các nhóm lung. Mt nhóm lung có th là
thành phn ca c các lung, và các nhóm lung.
Hai kiu nhóm lung thit lp (khi dng) là:
 public ThreadGroup(String str)
 đây, “str” là tên ca nhóm lung mi nht đc to ra.
 public ThreadGroup(ThreadGroup tgroup, String str)
 đây, “tgroup” ch ra lung đang chy hin thi nh là lung cha, “str” là tên ca
nhóm lung đang đc to ra.
Mt s các phng thc trong nhóm lung (ThreadGroup) đc cho nh sau:
 public synchronized int activeCount()
49
Tr v s lng các lung kích hot hin hành trong nhóm lung
 public sunchronized int activeGroupCount()
Tr v s lng các nhóm hot đng trong nhóm lung
 public final String getName()
Tr v tên ca nhóm lung
 public final ThreadGroup getParent()
Tr v cha ca nhóm lung
10. S đng b lung
Trong khi đang làm vic vi nhiu lung, nhiu hn mt lung có th mun thâm
nhp cùng bin ti cùng thi đim. Ly ví d, mt lung có th c gng đc d liu, trong
khi lung khác c gng thay đi d liu. Trong trng hp này, d liu có th b sai lc.
Trong nhng trng hp này, bn cn cho phép mt lung hoàn thành trn vn
tác v ca nó (thay đi giá tr), và ri thì cho phép các lung k tip thc thi. Khi hai
hoc nhiu hn các lung cn thâm nhp đn mt tài nguyên đc chia s, bn cn chc


Nhờ tải bản gốc
Music ♫

Copyright: Tài liệu đại học © DMCA.com Protection Status