论坛首页 Java企业应用论坛

多线程 interrupt() 中断

浏览 11458 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (2) :: 隐藏帖 (0)
作者 正文
   发表时间:2011-10-20  
CurrentJ 写道
对于没有处于阻塞状态(wait/sleep/join等)的线程,java不能真正的终止线程,需要你自己在代码里判断Thread.interrupted(),然后抛出自己的异常,相当于线程终止。


That is the point
0 请登录后投票
   发表时间:2011-10-20  
有一篇很久以前看的博文可以解答你的疑惑。。
http://hxraid.iteye.com/blog/429005
0 请登录后投票
   发表时间:2011-10-21  
gtssgtss 写道
lz不懂interrupt是什么
interrupt默认情况只做了一件事,就是改了一个boolean的field


说的很极端,但基本上是这个意思了。
interrupt只是告诉你要中断,
但具体是中断还是不中断、或者是做其他操作,还是自己说了算。
0 请登录后投票
   发表时间:2011-10-21  

1.去掉main方法的 aa.interrupt();// 中断
2.在A类的run方法中添加 this.interrupt();
public void run() {
        while (!Thread.currentThread().isInterrupted()) {
            System.out.println("A  在中断前:" + Thread.currentThread().isInterrupted());
            try {
                Thread.sleep(1000);
                this.interrupt();-->中断自己
           } catch (InterruptedException e) {
                System.out.println("--A  在中断异常---:" + isInterrupted());
                e.printStackTrace();
            }
        }

    }
0 请登录后投票
   发表时间:2011-10-21  
AliKevin2011 写道

1.去掉main方法的 aa.interrupt();// 中断
2.在A类的run方法中添加 this.interrupt();
public void run() {
        while (!Thread.currentThread().isInterrupted()) {
            System.out.println("A  在中断前:" + Thread.currentThread().isInterrupted());
            try {
                Thread.sleep(1000);
                this.interrupt();-->中断自己
           } catch (InterruptedException e) {
                System.out.println("--A  在中断异常---:" + isInterrupted());
                e.printStackTrace();
            }
        }

    }

为什么这么改??
0 请登录后投票
   发表时间:2011-10-21  
hardPass 写道
gtssgtss 写道
lz不懂interrupt是什么
interrupt默认情况只做了一件事,就是改了一个boolean的field


说的很极端,但基本上是这个意思了。
interrupt只是告诉你要中断,
但具体是中断还是不中断、或者是做其他操作,还是自己说了算。

那为什么中断后的不一样??
0 请登录后投票
   发表时间:2011-10-22  
建议你看看下面这个程序,看懂了就明白了!



/*
* 如果线程被阻塞,它便不能核查共享变量,也就不能停止。这在许多情况下会发生,例如调用
* Object.wait()、ServerSocket.accept()和DatagramSocket.receive()时,他们都可能永
* 久的阻塞线程。即使发生超时,在超时期满之前持续等待也是不可行和不适当的,所以,要使
* 用某种机制使得线程更早地退出被阻塞的状态。很不幸运,不存在这样一种机制对所有的情况
* 都适用,但是,根据情况不同却可以使用特定的技术。使用Thread.interrupt()中断线程正
* 如Example1中所描述的,Thread.interrupt()方法不会中断一个正在运行的线程。这一方法
* 实际上完成的是,在线程受到阻塞时抛出一个中断信号,这样线程就得以退出阻塞的状态。更
* 确切的说,如果线程被Object.wait, Thread.join和Thread.sleep三种方法之一阻塞,那么,
* 它将接收到一个中断异常(InterruptedException),从而提早地终结被阻塞状态。因此,
* 如果线程被上述几种方法阻塞,正确的停止线程方式是设置共享变量,并调用interrupt()(注
* 意变量应该先设置)。如果线程没有被阻塞,这时调用interrupt()将不起作用;否则,线程就
* 将得到异常(该线程必须事先预备好处理此状况),接着逃离阻塞状态。在任何一种情况中,最
* 后线程都将检查共享变量然后再停止。下面示例描述了该技术。
* */
package Concurrency.Interrupt;

class Example3 extends Thread {

volatile boolean stop = false;

public static void main(String args[]) throws Exception {
Example3 thread = new Example3();

System.out.println("Starting thread...");
thread.start();

Thread.sleep(3000);

System.out.println("Asking thread to stop...");

/*
* 如果线程阻塞,将不会检查此变量,调用interrupt之后,线程就可以尽早的终结被阻
* 塞状 态,能够检查这一变量。
* */
thread.stop = true;

/*
* 这一方法实际上完成的是,在线程受到阻塞时抛出一个中断信号,这样线程就得以退
* 出阻 塞的状态
* */
thread.interrupt();

Thread.sleep(3000);
System.out.println("Stopping application...");
System.exit(0);
}

public void run() {
while (!stop) {
System.out.println("Thread running...");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
// 接收到一个中断异常(InterruptedException),从而提早地终结被阻塞状态
System.out.println("Thread interrupted...");
}
}

System.out.println("Thread exiting under request...");
}
}
/*
* 把握几个重点:stop变量、run方法中的sleep()、interrupt()、InterruptedException。串接起
* 来就是这个意思:当我们在run方法中调用sleep(或其他阻塞线程的方法)时,如果线程阻塞的
* 时间过长,比如10s,那在这10s内,线程阻塞,run方法不被执行,但是如果在这10s内,stop被
* 设置成true,表明要终止这个线程,但是,现在线程是阻塞的,它的run方法不能执行,自然也就
* 不能检查stop,所 以线程不能终止,这个时候,我们就可以用interrupt()方法了:我们在
* thread.stop = true;语句后调用thread.interrupt()方法, 该方法将在线程阻塞时抛出一个中断
* 信号,该信号将被catch语句捕获到,一旦捕获到这个信号,线程就提前终结自己的阻塞状态,这
* 样,它就能够 再次运行run 方法了,然后检查到stop = true,while循环就不会再被执行,在执
* 行了while后面的清理工作之后,run方法执行完 毕,线程终止。
* */
1 请登录后投票
   发表时间:2011-11-16  
楼上说的是,

interrupt 作用就是唤醒阻塞的线程进入就绪准备运行。 while的runflag最好还是用共享的变量进行控制。
0 请登录后投票
   发表时间:2011-11-16  
agapple 写道

这里加一段Thread.currentThread().interrupt(); interrupt响应为InterruptedException后就会被重置,需要重新设置下




原来是这样嗦,  我疑惑了好长一阵子呢!  受教  ,学习了。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics