本帖最后由 袁梦希 于 2013-4-25 19:28 编辑
楼主你好,根据个人的理解
1-----当开启线程的时候t1.start(); t2.start(); t1和t2同时执行run()方法,某个线程先判断锁,然后这个线程执行run方法了,执行到wait()了,让线程等在那里了。
2-----这时候另一个线程获得了执行权,在run方法外面进来了,一判断执行也等在那里了,因为这是个同步函数。
3-----然后main这个主线程开始往下执行,当把1到60个数都执行完以后,两个线程都在wait()那里等着呢,某个线程调用了changeFlag();把true变为了false。
4-----这时候两个线程都等在那里了,然后执行到线程的中断t1.interrupt();t2.interrupt(); 两个线程判断run方法的while中的flag为false,结束了线程,抛了异常。
这时候才把两个线程都打印了。
所以楼主要问的,当两个线程进入while前、进入while后,并且等在里面的时候,绿色的while里面的时候flag为true。
当线程调用中断线程的方法时,肯定为false 。这时候抛异常,也就把异常打印处理。
- package com.xbox;
- class StopThread implements Runnable{
- private boolean flag = true;
- public synchronized void run(){
- while(flag){
-
- System.out.println("while中的flag为"+flag);
- try{
- System.out.println(Thread.currentThread().getName());
- wait();
- }
- catch (InterruptedException e){
- System.out.println(Thread.currentThread().getName()+"...Exception");
- }finally{
-
- System.out.println("最后的"+flag);
- //判断这时候的finally中的flag为false了,可是两个线程早已经执行完事了
- //因为是两个线程,所以打印两次
- }
- }
- }
- public void changeFlag(){
- flag = false;
-
- }
- }
- class Test{
- public static void main(String[] args) {
- StopThread st = new StopThread();
- Thread t1 = new Thread(st);
- Thread t2 = new Thread(st);
- t1.start();//开启线程
- t2.start();
- int num = 0;
- while(true){
- if(num++ == 60){
- st.changeFlag();
- t1.interrupt();//中断线程
- t2.interrupt();
- break;
- }
- System.out.println(Thread.currentThread().getName()+"......"+num);
- }
- }
- }
复制代码 希望可以帮到你
|