首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2SE开发 >

关于多线程的一个小疑义

2013-07-01 
关于多线程的一个小疑问方法如下:public class Runner2 implements Runnable {public void run() {try {fo

关于多线程的一个小疑问
方法如下:

public class Runner2 implements Runnable {
    public void run() {
        try {
            for (int i = 0; i < 30; i++) {
                System.out.println(i);
                Thread.sleep(1000);
            }
        } catch (InterruptedException ex) {
             System.out.println("线程被中断");
            return;
        }
    }
}
public class TestInterupt {
    public static void main(String[] args) {
        Runner2 runner2 = new Runner2();
        Thread t = new Thread(runner2);
        t.start();
        try {
            Thread.sleep(10000);
             t.interrupt();
        } catch (InterruptedException ex) {
            System.out.println("主线程被中断");
        }
    }
}

我编译并执行TestInterup输出的结果是
0
1
2
3
4
5
6
7
8
9

可是我之后将Runner2类进行改写,代码如下:
public class Runner2 implements Runnable {
    public void run() {
        try {
            for (int i = 0; i < 30; i++) {
                Thread.sleep(1000);
                System.out.println(i);
            }
        } catch (InterruptedException ex) {
             System.out.println("线程被中断");
            return;
        }
    }
}

为什么我再次编译执行TestInterup类,其输出的结果却是:
0
1
2
3
4
5
6
7
8

为什么这次没有输出9呢? 多线程
------解决方案--------------------


原因是因为主线程在停留10秒后调用了t.interrupt,在这10秒的过程中,子线程有可能循环执行9次,也有可能执行10次,或者8次都有可能。
[解决办法]
10000 = 10 * 1000,计时器没有那么精准,interrupt很可能在最后一次sleep的时候就被执行了。至于为什么没有“线程被中断”的输出,你只要在interrupt之后再睡一会儿就有了,因为执行完interrupt,主线程退出,程序也就退出了,自然没有输出。

热点排行
Bad Request.