Thread Join 讲解
Thread Join 簡單理解就是等待被調(diào)用join的線程先執(zhí)行完,再自己執(zhí)行;或者并發(fā)線程串行化。
不要輕易的使用join否則嚴(yán)重降低線程并發(fā)性能;jdk 并不建議使用join。
jdk 解釋join原文:
public final void?join()?throws InterruptedException Waits for this thread to die. Throws: InterruptedException? - if any thread has interrupted the current thread. The?interrupted status?of the current thread is cleared when this exception is thrown.
demo:
package test;public class ThreadA extends Thread{@Overridepublic void run() {// TODO Auto-generated method stubfor(int i = 0;i < 5; i++){System.out.printf("ThreadA " + "run i=" + i + "\n");try {Thread.sleep(2000);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}System.out.printf("ThreadA " + "END..." + "\n");} } package test;public class ThreadB extends Thread{private ThreadA at;public ThreadB(ThreadA at){this.at = at;}@Overridepublic void run() {// TODO Auto-generated method stubSystem.out.printf("ThreadB " + "START..." + "\n");System.out.printf("ThreadB " + "END..." + "\n");try {at.join();} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}} package test;public class threadMain {public static void main(String[] args) {// TODO Auto-generated method stubThreadA at = new ThreadA();ThreadB bt = new ThreadB(at);at.start();try {Thread.sleep(2000);System.out.println("main " + "run..." + "\n");System.out.println("main " + "end..." + "\n");bt.join();} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}bt.start();}}日志打印:
ThreadA run i=0
main run...
main end...
ThreadB START...
ThreadB END...
ThreadA run i=1
ThreadA run i=2
ThreadA run i=3
ThreadA run i=4
ThreadA END...
可以看出使用join之前的代碼是可以先被執(zhí)行的,所以join使用位置很重要。
代碼調(diào)整如下:
package test;public class ThreadA extends Thread{@Overridepublic void run() {// TODO Auto-generated method stubfor(int i = 0;i < 5; i++){System.out.printf("ThreadA " + "run i=" + i + "\n");try {Thread.sleep(2000);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}System.out.printf("ThreadA " + "END..." + "\n");} } package test;public class ThreadB extends Thread{private ThreadA at;public ThreadB(ThreadA at){this.at = at;}@Overridepublic void run() {try {at.join();} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}// TODO Auto-generated method stubSystem.out.printf("ThreadB " + "START..." + "\n");System.out.printf("ThreadB " + "END..." + "\n");}} package test;public class threadMain {public static void main(String[] args) {// TODO Auto-generated method stubThreadA at = new ThreadA();ThreadB bt = new ThreadB(at);at.start();try {//Thread.sleep(2000);bt.join();System.out.println("main " + "run..." + "\n");System.out.println("main " + "end..." + "\n");} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}bt.start();}}日志打印:
ThreadA run i=0
main run...
main end...
ThreadA run i=1
ThreadA run i=2
ThreadA run i=3
ThreadA run i=4
ThreadA END...
ThreadB START...
ThreadB END...
為什么main還是早于bt執(zhí)行,在于main中先調(diào)用join然后bt.start;如果調(diào)用join 的時(shí)候線程沒有運(yùn)行join是不生效的。
main做修改:
package test;public class threadMain {public static void main(String[] args) {// TODO Auto-generated method stubThreadA at = new ThreadA();ThreadB bt = new ThreadB(at);at.start();bt.start();try {//Thread.sleep(2000);System.out.println("main sleep over, and bt join.");bt.join();System.out.println("main " + "run..." + "\n");System.out.println("main " + "end..." + "\n");} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}日志打印:
ThreadA run i=0
main sleep over, and bt join.
ThreadA run i=1
ThreadA run i=2
ThreadA run i=3
ThreadA run i=4
ThreadA END...
ThreadB START...
ThreadB END...
main run...
main end...
總結(jié)
以上是生活随笔為你收集整理的Thread Join 讲解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Thread 中 ThreadLocal
- 下一篇: sonar 使用问题 Unable to