Java 線程學習(3):sleep()和join()方法
sleep方法會使當前的線程暫停執行一定時間(給其它線程運行機會)。讀者可以運行示例1,看看結果就明白了。sleep方法會拋出異常,必須提供捕獲代碼。
實例一:
實例二:
join()方法:
join()方法,它能夠使調用該方法的線程在此之前執行完畢。
實例a
把上面的代碼改成如下:
實例一:
public class ThreadTest implements Runnable{
public void run(){
for(int k=0;k<5;k++){
if(k==2){
try{
Thread.currentThread().sleep(5000);
}
catch(Exception e){}
}
System.out.println(Thread.currentThread().getName()
+":"+k);
}
}
public static void main(String[] args){
Runnable r=new ThreadTest();
Threadt 1=new Thread(r,"t1_name");
Threadt 2=new Thread(r,"t2_name");
t1.setPriority(Thread.MAX_PRIORITY);
t2.setPriority(Thread.MIN_PRIORITY);
t1.start();
t2.start();
}
}
t1被設置了最高的優先級,t2被設置了最低的優先級。t1不執行完,t2就沒有機會執行。但由于t1在執行的中途休息了5秒中,這使得t2就有機會執行了。public void run(){
for(int k=0;k<5;k++){
if(k==2){
try{
Thread.currentThread().sleep(5000);
}
catch(Exception e){}
}
System.out.println(Thread.currentThread().getName()
+":"+k);
}
}
public static void main(String[] args){
Runnable r=new ThreadTest();
Threadt 1=new Thread(r,"t1_name");
Threadt 2=new Thread(r,"t2_name");
t1.setPriority(Thread.MAX_PRIORITY);
t2.setPriority(Thread.MIN_PRIORITY);
t1.start();
t2.start();
}
}
實例二:
public class ThreadTest implements Runnable{
public synchronized void run(){
for(int k=0;k<5;k++){
if(k==2){
try{
Thread.currentThread().sleep(5000);
}
catch(Exceptione){}
}
System.out.println(Thread.currentThread().getName()
+":"+k);
}
}
publicstaticvoidmain(String[]args){
Runnable r=new ThreadTest();
Threadt 1=new Thread(r,"t1_name");
Threadt 2=new Thread(r,"t2_name");
t1.start();
t2.start();
}
}
請讀者首先運行示例程序,從運行結果上看:一個線程在sleep的時候,并不會釋放這個對象的鎖標志。public synchronized void run(){
for(int k=0;k<5;k++){
if(k==2){
try{
Thread.currentThread().sleep(5000);
}
catch(Exceptione){}
}
System.out.println(Thread.currentThread().getName()
+":"+k);
}
}
publicstaticvoidmain(String[]args){
Runnable r=new ThreadTest();
Threadt 1=new Thread(r,"t1_name");
Threadt 2=new Thread(r,"t2_name");
t1.start();
t2.start();
}
}
join()方法:
join()方法,它能夠使調用該方法的線程在此之前執行完畢。
實例a
public class ThreadTest implements Runnable{
public static int a=0;
public void run(){
for(intk=0;k<5;k++){
a=a+1;
}
}
public static void main(String[] args){
Runnable r=new ThreadTest();
Thread t=new Thread(r);
t.start();
System.out.println(a);
}
}
運行結果不一定是5, 如果想讓 輸出的結果是5, 需要運用join,public static int a=0;
public void run(){
for(intk=0;k<5;k++){
a=a+1;
}
}
public static void main(String[] args){
Runnable r=new ThreadTest();
Thread t=new Thread(r);
t.start();
System.out.println(a);
}
}
把上面的代碼改成如下:
public class ThreadTest implements Runnable{
public static int a=0;
public void run(){
for(intk=0;k<5;k++){
a=a+1;
}
}
public static void main(String[] args){
Runnable r=new ThreadTest();
Thread t=new Thread(r);
t.start();
t.join();
System.out.println(a);
}
}
測試一下以上的代碼即可,答案為輸出5.join()方法會拋出異常,應該提供捕獲代碼。或留給JDK捕獲。public static int a=0;
public void run(){
for(intk=0;k<5;k++){
a=a+1;
}
}
public static void main(String[] args){
Runnable r=new ThreadTest();
Thread t=new Thread(r);
t.start();
t.join();
System.out.println(a);
}
}
posted on 2009-02-26 19:44 草原上的駱駝 閱讀(469) 評論(0) 編輯 收藏 所屬分類: JAVA基礎知識