黑马程序员技术交流社区
标题:
如何结束一个线程
[打印本页]
作者:
frankzheng329
时间:
2015-4-30 01:01
标题:
如何结束一个线程
看到视频说用interrupt() 方法. 那么会造成死锁的情况吗?
作者:
jiangwenjun
时间:
2015-4-30 01:20
1、首先在继承或者实现的子类成员定义一个布尔值变量。2、run()方法中用判断布尔值括住while(true)的整个循环方法。3、你在主线程自定义一个循环,然后循环内做一个判断,在一定条件才使 (1)步骤中的布尔值改变。就停了
作者:
苟苟
时间:
2015-4-30 09:41
可以采用标志位方法.但是如果是被sleep和wait的时候作用不大. 推荐使用中断异常机制.代码如下:
public class InterruptedThreadDemo {
public static void main(String[] args) {
// 子线程开启
ThreadTerminal tt = new ThreadTerminal();
tt.start();
try {
// 主线程休息3s,然后打断子线程
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
// 打断子线程
tt.interrupt();
}
}
class ThreadTerminal extends Thread {
private int counter = 0;
public void run() {
synchronized (this) {
while (true) {
System.out.println("time = " + System.currentTimeMillis());
counter++;
try {
if (counter == 5) {
// 使线程处于阻塞状态
wait();
}
} catch (InterruptedException e) {
// 捕获InterruptedException,然后退出程序
System.out.println("捕获到InterruptedException , 线程结束");
return;
}
}
}
}
}
复制代码
另外,我们还要注意:
1,每个线程都有一个boolean类型的中断状态.当中断线程时,这个线程的中断状态将被设置为true.
2,interrupt方法能够中断目标线程,而isInterrupted方法能返回目标线程的中断状态.静态的interrupted方法将清除当前线程的中断状态,并返回它之前的值,这也是清除中断状态的唯一方法.
3,响应中断执行的操作: 清除中断状态, 抛出InterruptedException,表示阻塞操作由于中断提前结束.JVM并不能保证阻塞方法检测到中断的速度,但在实际情况中响应速度还是非常快的.
4,调用interrupt并不意味着立即停止目标线程正在进行的工作,而只是传递了请求中断的消息.
5,一般而言,中断是实现取消的最合理方式
如有疑问可以继续探讨
作者:
an_lucas
时间:
2015-4-30 09:52
来学习学习
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2