概念
join可以理解成为强行抢占资源,谁调用join()谁抢占资源就先运行,要么运行完,要么设置占用资源时间。
join为非静态方法,定义如下:
1 2 3 4 5 6
| void join() 等待该线程终止。 void join(long millis) 等待该线程终止的时间最长为 millis 毫秒。 void join(long millis, int nanos) 等待该线程终止的时间最长为 millis 毫秒 + nanos 纳秒。
|
join()方法使等待当前Thread对象完成线程,例如thread1.join()表示等这个线程结束再执行下一个线程,而且,使用join()方法,必须注意顺序,打个比方:
1 2 3
| thread2.start(); thread2.join(); thread1.start();
|
这样的顺序join()方法才有用,如果使用:
1 2 3
| thread2.start(); thread1.start(); thread2.join();
|
这样的顺序没有改变什么!完全没有发挥join()方法的特点。
测试
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| /*** * Java多线程—抢占 * */ public class Join { public static void main(String[] args){ Thread t1 = new JoinThread("AA"); t1.start(); try{ t1.join(500); } catch(InterruptedException e) { e.printStackTrace(); } System.out.println("over"); } } class JoinThread extends Thread{ public JoinThread(String name){ super(name); } public void run(){ for(int i=0; i<10; i++){ for(long k=0; k<100000000; k++){} System.out.println(this.getName() + ": " +i); } }
|
输出结果
1 2 3 4 5 6 7 8 9 10 11
| AA: 0 AA: 1 AA: 2 AA: 3 AA: 4 AA: 5 AA: 6 over AA: 7 AA: 8 AA: 9
|
但是如果把 t.join(500) 改成 t.join() 的话输出结果会变成:
1 2 3 4 5 6 7 8 9 10 11
| AA: 0 AA: 1 AA: 2 AA: 3 AA: 4 AA: 5 AA: 6 AA: 7 AA: 8 AA: 9 over
|
这样子就很明显了,t.join(int wait_time)
;后面的代码想要执行需要满足以下条件之一:
1、线程t死了
;
2、等待时间超过wait_time
;