java中join方法的理解与说明详解
前言:
java中的join()方法在多线程中会涉及到,这个方法最初理解起来可能有点抽象,用一两次大概就懂了。简单说就是当前线程等待调用join方法的线程结束才能继续往下执行。
1.举个例子
如下,
MyRunnable类是实现Runnable接口的多线程类,其run()方法是一个计算,计算值存储在result字段,获取计算结果就必须等线程执行完之后调用getResult()获取
publicclassMyRunnableimplementsRunnable{ privateintnum; privateStringthreadName; privatelongresult; publicMyRunnable(intnum,StringthreadName){ this.threadName=threadName; this.num=num; } publicvoidrun(){ for(inti=0;i publicclassNormalTest{ publicstaticvoidmain(String[]args){ normal(); } privatestaticvoidnormal(){ MyRunnablemyRunnable_1=newMyRunnable(1000,"runnable_1"); Threadthread_1=newThread(myRunnable_1); thread_1.start(); do{ System.out.println("--------------------------------------------------"); System.out.println("threadstatus:"+thread_1.isAlive()+",result:"+myRunnable_1.getResult()); }while(thread_1.isAlive()); } }获取计算结果需要持续判断线程thread_1是否结束才能最终获取,输出如下:
--------------------------------------------------
threadstatus: true,result:0
--------------------------------------------------
threadstatus: true,result:11026
--------------------------------------------------
threadstatus: false,result:499500而使用join()方法可以省去判断的麻烦,如下
publicclassJoinTest{ publicstaticvoidmain(String[]args){ join(); } privatestaticvoidjoin(){ MyRunnablemyRunnable_1=newMyRunnable(1000,"runnable_1"); Threadthread_1=newThread(myRunnable_1); thread_1.start(); try{ thread_1.join(); }catch(InterruptedExceptione){ e.printStackTrace(); } System.out.println("threadstatus:"+thread_1.isAlive()+",result:"+myRunnable_1.getResult()); } }输出如下:
threadstatus: false,result:499500
调用join方法以后当前线程(在这里就是main函数)会等待thread_1结束后才继续执行下面的代码。
2.jion()方法源码解析
其实join()方法内部的实现跟上面例子中的normal()方法很类似,也是使用线程的isAlive()方法来判断线程是否结束,核心源码如下:
publicfinalsynchronizedvoidjoin(longmillis) throwsInterruptedException{ longbase=System.currentTimeMillis(); longnow=0; if(millis<0){ thrownewIllegalArgumentException("timeoutvalueisnegative"); } if(millis==0){//join方法如果不传参数会默认millis为0 while(isAlive()){ wait(0); } }else{ while(isAlive()){ longdelay=millis-now; if(delay<=0){ break; } wait(delay); now=System.currentTimeMillis()-base; } } }当然上述还涉及Object类的wait()方法,感兴趣可以查一下,这里可以简单的理解就是一个等待多少时间。
总结
到此这篇关于java中join方法的理解与说明的文章就介绍到这了,更多相关java中join方法内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!