- class StopThread implements Runnable
- {
- private boolean flag = true;
- public synchronized void run()
- {
- while(flag)
- {
- try
- {
- wait();
- }
- catch (InterruptedException e)
- {
- System.out.println(Thread.currentThread().getName()+".....Exception");
- //setFlag();
- }
- System.out.println(Thread.currentThread().getName()+".....");
- }
- }
- public void setFlag()
- {
- flag = false;
- }
- }
- class StopThreadDemo
- {
- public static void main(String[] args)
- {
- StopThread st = new StopThread();
- Thread t1 = new Thread(st);
- Thread t2 = new Thread(st);
-
- //t1.setDaemon(true);
- //t2.setDaemon(true);//将两个线程全标记成后台线程。
- t1.start();
- t2.start();
- int num = 1;
- while(true)
- {
- if(num++==50)
- {
-
- t1.interrupt(); // (1)
- t2.interrupt(); // (2)
- st.setFlag(); // (3)
-
- break;
- }
-
- System.out.println(Thread.currentThread().getName()+"....."+num);
- }
- }
- }
复制代码 这个是老师视频里的例题,我把(3)改动到1和2的下面,并把抛出异常中的setFlag();注释掉,按我的理解1,2,3是按顺序执行的,当程序执行到我注释的1,2的地方时,按我的理解是t1和t2线程结束冻结状态,抛出异常,打印
System.out.println(Thread.currentThread().getName()+".....")语句后,这时又循环到了wait语句,再次冻结。这时运行3, 改变标记,但是 t1和t2还是在冻结
冻结状态的啊,为什么程序能结束呢? |