在java应用程序中,可不可以等待某个线程执行完后才执行后面的代码
来源: 互联网 发布时间:2015-05-05
本文导语: 在java应用程序中,可不可以等待某个线程执行完后才执行后面的代码? | 同意楼上的,看个例子 import java.io.*; public class MethodTest { static PrintWriter out = new PrintWriter(System.out,true); ...
在java应用程序中,可不可以等待某个线程执行完后才执行后面的代码?
|
同意楼上的,看个例子
import java.io.*;
public class MethodTest {
static PrintWriter out = new PrintWriter(System.out,true);
public static void main(String[] args) {
FirstThread first = new FirstThread();
SecondThread second = new SecondThread();
first.start();
second.start();
//本来程序中只有主线程,现在多了两个线程
try{
out.println("Waiting for first thread to finish...");
first.join();
//join的意思就是说先让主线程等待,运行first线程,等first的run方法结束后
//再接着运行主线程
out.println("It's a long wait!");
out.println("Wakong up second thread...");
synchronized(second){
second.notify();
}
out.println("Waiting for second thread to finish...");
second.join();
//与上面的一样,让主线程等待,运行second的run方法
}catch(InterruptedException e){
}
out.println("I'm ready to finish too.");
}
}
class FirstThread extends Thread{
public void run(){
try{
MethodTest.out.println(" First thread starts running.");
sleep(10000);
MethodTest.out.println(" First thread finishes running.");
}catch(InterruptedException e){
}
}
}
class SecondThread extends Thread{
public synchronized void run(){
try{
MethodTest.out.println(" Second thread starts running.");
MethodTest.out.println(" Second thread suspends itself.");
wait();
MethodTest.out.println(" Second thread runs again and finishes.");
}catch(InterruptedException e){
}
}
}
你可以先运行一下试试,然后再去掉两处join,比较结果
import java.io.*;
public class MethodTest {
static PrintWriter out = new PrintWriter(System.out,true);
public static void main(String[] args) {
FirstThread first = new FirstThread();
SecondThread second = new SecondThread();
first.start();
second.start();
//本来程序中只有主线程,现在多了两个线程
try{
out.println("Waiting for first thread to finish...");
first.join();
//join的意思就是说先让主线程等待,运行first线程,等first的run方法结束后
//再接着运行主线程
out.println("It's a long wait!");
out.println("Wakong up second thread...");
synchronized(second){
second.notify();
}
out.println("Waiting for second thread to finish...");
second.join();
//与上面的一样,让主线程等待,运行second的run方法
}catch(InterruptedException e){
}
out.println("I'm ready to finish too.");
}
}
class FirstThread extends Thread{
public void run(){
try{
MethodTest.out.println(" First thread starts running.");
sleep(10000);
MethodTest.out.println(" First thread finishes running.");
}catch(InterruptedException e){
}
}
}
class SecondThread extends Thread{
public synchronized void run(){
try{
MethodTest.out.println(" Second thread starts running.");
MethodTest.out.println(" Second thread suspends itself.");
wait();
MethodTest.out.println(" Second thread runs again and finishes.");
}catch(InterruptedException e){
}
}
}
你可以先运行一下试试,然后再去掉两处join,比较结果
|
wait()
或是标志位
或是标志位
|
no
是threadA.join();//某线程堵晒直到执行完
是threadA.join();//某线程堵晒直到执行完