大壹哥 2011-07-05 09:17
浏览 289
已采纳

一段关于线程代码的思考

由于是第一次在技术坛发帖,写的不好请各位大大勿拍!


public class InterruptTest extends Thread{
static int result=0;
public InterruptTest(String name)
{
super(name);
}
public static void main(String args[])
{
    System.out.println("开始主线程");
    Thread t1 = new InterruptTest("计算机线程");
    t1.start();
    //System.out.println("result:"+result);
    try {
        long time1 = System.nanoTime();
        t1.join(2000);
        long time2 = System.nanoTime();
        t1.interrupt();//中断线程
        System.out.println((time2-time1)/1000000+"毫秒后"+result);
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

}

public void run()
{
    System.out.println(this.getName()+"开始计算......");
    try {
        Thread.sleep(1000);
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        System.out.println(this.getName()+"线程被中断......");
        return;
        //e.printStackTrace();
    }
    result = (int)(Math.random()*10000);
    System.out.println("------"+result);
    System.out.println(this.getName()+"结束计算.....");
}

}


console的输出信息为:

按照正常情况来说的话,线程interrupt后,后面的语句应该是不执行的。以前对线程总是半知半解的,这次希望大家给我解解惑!

问题补充
悲剧了 写道
哥们你 Thread t1 = new JoinTest("计算机线程"); 
中JoinTest来自哪?

额,不好意思,写错了!
问题补充
恩,线程中断之后应该是不会执行后面的语句了吧?
问题补充
悲剧了 写道
java_xiaoyi 写道
恩,线程中断之后应该是不会执行后面的语句了吧?

你说的是这个么?
System.out.println((time2 - time1) / 1000000 + "毫秒后" + result);
如是,你只是中断你的t1线程,关main线程什么事情


不是这个,因为我在主线程里调用了join方法,然后突然interupt掉,这个时候在run方法应该会报异常,进入到catch里面去,输出"System.out.println(this.getName()+"线程被中断......");"这个吧?
问题补充
引用

不中断的原因是你的join时间太长, 改成t1.join(800)

明白了!哎,现在知道这个帖子太烂了~~ 下次发帖一定注意!
问题补充
blackbeans 写道
哥们你这个程序在
t1.interrupt();//中断线程 
这一步的时候Thread.sleep(1000)已经过期了,从sleep可中断块已经走出来了,而这个时候interrupt是已经失效了,interrupt只能打断能够接收中断的信号的操作,比如阻塞的take(),poll()这些

你的意思是说不能中断sleep的操作?
问题补充
悲剧了 写道
java_xiaoyi 写道
引用

不中断的原因是你的join时间太长, 改成t1.join(800)

明白了!哎,现在知道这个帖子太烂了~~ 下次发帖一定注意!


没事,大家都是这么过来的,只要态度好就很好

呵呵,共勉!
问题补充
icewubin 写道
实际工作中,一般不使用interrupt这种方式。

冰神,你太全能了吧,编程也懂?
  • 写回答

15条回答 默认 最新

  • A446818000 2011-07-05 09:17
    关注

    [quote="java_xiaoyi"][quote="悲剧了"][quote="java_xiaoyi"]恩,线程中断之后应该是不会执行后面的语句了吧?[/quote]
    你说的是这个么?
    System.out.println((time2 - time1) / 1000000 + "毫秒后" + result);
    如是,你只是中断你的t1线程,关main线程什么事情

    [/quote]
    不是这个,因为我在主线程里调用了join方法,然后突然interupt掉,这个时候在run方法应该会报异常,进入到catch里面去,输出"System.out.println(this.getName()+"线程被中断......");"这个吧?[/quote]

    不中断的原因是你的join时间太长, 改成t1.join(800)

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(14条)

报告相同问题?

悬赏问题

  • ¥100 关于使用MATLAB中copularnd函数的问题
  • ¥20 在虚拟机的pycharm上
  • ¥15 jupyterthemes 设置完毕后没有效果
  • ¥15 matlab图像高斯低通滤波
  • ¥15 针对曲面部件的制孔路径规划,大家有什么思路吗
  • ¥15 钢筋实图交点识别,机器视觉代码
  • ¥15 如何在Linux系统中,但是在window系统上idea里面可以正常运行?(相关搜索:jar包)
  • ¥50 400g qsfp 光模块iphy方案
  • ¥15 两块ADC0804用proteus仿真时,出现异常
  • ¥15 关于风控系统,如何去选择