A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

© 善良的禽兽 中级黑马   /  2015-9-25 23:59  /  278 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文


/* 需求:
*   调用一个线程A, 然后在线程A运行的时候调用线程B的join()方法,
*   然后观察, 是否在B线程全部运行完毕之后, A线程又开始运行;
*
*   定义两个类demoA和demoB, 这两个类都实现Runnable接口的run()方法;
*   然后创建两条线程ta, tb, 分别对应demoA和demoB;
*   第一阶段:
*      在main函数中开启线程ta, 当线程ta中的cnt还没有到达20之前,
*      实际上JVM中只有mian线程和ta线程交替运行的;
*   第二阶段:
*      当ta线程中的cnt等于20的时候, ta线程将tb线程开启,
*      然后调用tb线程的join()方法,此时tb线程就将ta线程的控制权抢夺了,
*      并且, 在tb线程没有运行完毕之前,ta线程就没法被唤醒, 所以在tb线程
*      没有运行完毕之前, JVM中只有两条线程,也就是main线程和tb线程自己,
*      这段时间内这两条线程交替运行,直到tb线程运行完毕;
*   第三阶段:
*      当tb线程运行完毕之后, 此时ta线程复活, 此时JVM中的两条线程就变成了
*      ta线程和main线程;
*/

class demoA implements Runnable
{
    demoB b = new demoB();
    Thread tb = new Thread(b);

    public void run()
    {
         int cnt = 0;
         while(cnt++ != 50)
         {
               if(cnt == 20)
               {
                   tb.start();
                   try{tb.join();}catch(Exception e){}
               }
               System.out.println("Thread------A..........." + cnt);
         }
    }
}

class demoB implements Runnable
{
     public void run()
     {
          int cnt = 0;
          while(cnt++ != 50)
          {
               System.out.println("Thread--------B........" + cnt);
          }
     }
}

class LockDemo
{
     public static void main(String[] args)
     {
          int cnt = 0;
          demoA a = new demoA();
          Thread ta = new Thread(a);

          ta.start();
          while(cnt++ != 200)
             System.out.println(Thread.currentThread().getName() + "...............run.....cnt = " + cnt);
     }
}


              

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马