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还是在冻结冻结状态的啊,为什么程序能结束呢? |
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) | 黑马程序员IT技术论坛 X3.2 |