/* 需求:
* 调用一个线程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);
}
}
|
|