join()是Thread类的一个方法。根据jdk文档的定义: public final void join()throws InterruptedException: Waits for this thread to die. join()方法的作用,是等待这个线程结束;但显然,这样的定义并不清晰。个人认为"Java 7 Concurrency Cookbook"的定义较为清晰: join() method suspends the execution of the calling thread until the object called finishes its execution. 也就是说,t.join()方法阻塞调用此方法的线程(calling thread),直到线程t完成,此线程再继续;通常用于在main()主线程内,等待其它线程完成再结束main()主线程。
- class Demo implements Runnable
- {
- @Override
- public void run() {
- for(int i=0; i<50; i++) {
- System.out.println(Thread.currentThread().getName() + " --> Demo" + i);
- }
- }
-
- }
- public class JoinDemo
- {
- public static void main(String[] args)
- {
- Demo d = new Demo() ;
- Thread t1=new Thread(d);
- t1.setName("t1"); //设置线程名称
- Thread t2=new Thread(d);
- t2.setName("t2"); //设置线程名称
-
- t1.start();
- t2.start();
-
- for(int i=0; i<50; i++) {
- if(i>10) {
- try {
- t1.join(); //线程t1强制执行
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- System.out.println("Main线程 --> " + i);
- }
- }
- }
复制代码 可以看出,Join方法实现是通过wait(小提示:Object 提供的方法)。 当main线程调用t1.join时候,main线程会获得线程对象t1的锁(wait 意味着拿到该对象的锁),调用该对象的wait(等待时间),直到该对象唤醒main线程 ,比如退出后。这就意味着main 线程调用t2.join时,必须能够拿到线程t2对象的锁。
|