zoukankan      html  css  js  c++  java
  • 多线程(七)~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
        哪个先运行是不确定的,不过①和②的操作是相同的锁,所以是互斥的。





  • 相关阅读:
    SpringBoot 项目瘦身
    对比两个文本的异同
    Spring 事务不起作用的场景
    Controller 层数据校验实现思路
    Notify 类的实现思路
    backup: 使用 vim 时一定会用到的设置 --for-myself
    exercise: 反射获取指定的属性值 --CSharp
    exercise: 序列化和反序列化Xml --CSharp
    前缀
    华罗庚的数学思想
  • 原文地址:https://www.cnblogs.com/douJiangYouTiao888/p/6473815.html
Copyright © 2011-2022 走看看