多線程(七)~join方法的使用


    作用:join()方法的作用是等待線程對象銷毀。

    join()方法具有能使線程排隊運行的作用,有點類似於同步的效果。
 
    join與synchronize的區別:
          join在內部使用wait()方法進行等待,底層用wait()來實現。
         synchronize關鍵字是以“對象監視器”為原理做同步操作。
 
    join()除了無參方法之外,還重載了join(毫秒)的方法,此方法與sleep(毫秒)的區別是:
         join()操作底層用wait()來實現,可以釋放鎖。
         sleep()不會釋放鎖。
 
join()釋放鎖的demo:
    線程類A:
  1. package com.wang.myjoin;
  2. publicclassThreadAextendsThread{
  3. privateThreadB threadB;
  4. publicThreadA(ThreadB threadB){
  5. this.threadB = threadB;
  6. }
  7. @Override
  8. publicvoid run(){
  9. synchronized(threadB){
  10. threadB.start();
  11. try{
  12. threadB.join();
  13. }catch(InterruptedException e1){
  14. e1.printStackTrace();
  15. }
  16. for(int i =0;i<10000;i++){
  17. System.out.println("b do sth....");
  18. }
  19. }
  20. }
  21. }
線程類B:
  1. package com.wang.myjoin;
  2. publicclassThreadBextendsThread{
  3. @Override
  4. publicvoid run(){
  5. System.out.println("B thread is run.");
  6. try{
  7. Thread.sleep(2000);
  8. }catch(InterruptedException e){
  9. e.printStackTrace();
  10. }
  11. System.out.println("B thread is over.");
  12. }
  13. publicsynchronizedvoid myService(){
  14. for(int i =0;i<100;i++){
  15. System.out.println("myService do sth."+ i);
  16. }
  17. }
  18. }
線程類C:
  1. package com.wang.myjoin;
  2. publicclassThreadCextendsThread{
  3. privateThreadB threadB;
  4. publicThreadC(ThreadB threadB){
  5. this.threadB = threadB;
  6. }
  7. @Override
  8. publicvoid run(){
  9. threadB.myService();
  10. }
  11. }
測試類:
  1. package com.wang.myjoin;
  2. publicclassJoinTest{
  3. publicstaticvoid main(String[] args){
  4. ThreadB threadB =newThreadB();
  5. ThreadA threadA =newThreadA(threadB);
  6. threadA.start();
  7. ThreadC threadC =newThreadC(threadB);
  8. threadC.start();
  9. System.out.println("~~~我來測試一下~~~~");
  10. }
  11. }
輸出結果:
  1. B thread is run.
  2. ~~~我來測試一下~~~~
  3. myService do sth.0
  4. myService do sth.1
  5. myService do sth.2
  6. .
  7. .
  8. .
  9. myService do sth.99
  10. B thread is over.
  11. b do sth....
  12. b do sth....
  13. .
  14. .
  15. .
可見線程在join()之后是釋放鎖的,其他線程可以訪問同鎖的synchronize方法。
       
需要注意的問題:join()后的方法有可能會提前運行:(這個沒試出來)
    我們同時執行以下三個操作:
    ①.thread1.start();
    ②.thread2.start();
    ③.sysout
     哪個先運行是不確定的,不過①和②的操作是相同的鎖,所以是互斥的。






免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM