我有以下代码:
renderThread = new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 10000000; i++) {
System.out.println("Number: " + i);
}
}
});
renderThread.start();
try {
Thread.sleep(100);
} catch (InterruptedException ex) {
ex.printStackTrace();
}
renderThread.interrupt(); //It should stop, but it does not stop.
renderThread.interrupt()
不会中断线程,它会继续运行。如果我用renderThread.interrupt()
替换.stop()
,则线程会停止。但是,不推荐使用.stop()
。
那么,如果stop
被弃用且interrupt
不起作用,停止某个主题的正确方法是什么?
答案 0 :(得分:20)
当你调用interrupt()时,它会触发一个布尔标志,告诉它应该停止的运行函数。这就是我经常写这样的运行函数的原因。
void run()
{
while(!Thread.interrupted())
{
//Do something
}
}
仅仅因为你打电话给中断并不意味着线程会立即停止或完全停止。这取决于运行函数中的内容。
答案 1 :(得分:6)
要真正说明为什么不应该使用Thread.stop()
?
Doug Lea最近提到Thread.stop将是 首先实现Java的方法 来Java 8。
他对某人发表评论的回应:
此外,另一个同步的事情是它处理它 异步中止线程(即线程.stop())。我知道stop()是 已弃用,但你永远都不知道。
是:
但你知道!从JDK8开始,Thread.stop真的不见了。它是 第一个已弃用的方法实际上已被取消实施。现在呢 只抛出UnsupportedOperationException。
http://cs.oswego.edu/pipermail/concurrency-interest/2013-December/012028.html
答案 2 :(得分:5)
你应该看看这篇文章: http://10kloc.wordpress.com/2013/03/03/java-multithreading-steeplechase-stopping-threads/
基本上你不应该停止一个线程(不安全),但要中断它。 你缺少的是让线程处理中断。
答案 3 :(得分:3)
所有你需要做的是中断当前线程或终止线程的运行过程 在catch块中添加以下语句
try
{
Thread.sleep(4000);
System.out.println("VAS CONSULTING")
}
catch(InterruptedException e)
{
//Stop printing out VAS CONSULTING
return; /*This will terminate the thread*/
}
如果在run方法中没有使用不会引发中断异常的方法 你可以这样做来处理线程中断或终止线程
@Override
public void run()
{
System.out.println("VAS CONSULTING");
if(Thread.Interrupted())
{
doSomethingElse();//process something else within the thread
return; //Terminates the current Thread
}
}
我希望这可以帮助你或其他人。
答案 4 :(得分:2)
renderThread.interrupt()不会中断线程,它会继续 跑。
interrupt()
,则设置中断状态。wait
方法之一或此类的Thread.join
和Thread.sleep
方法中阻止此线程,则其中断状态将为被清除,它将收到InterruptedException
。例如:
Thread t = new Thread()
{
public void run()
{
try {
for(int i=0; i<10000;i++)
System.out.println("Is interrupTed? "+this.isInterrupted());
Thread.sleep(200);
} catch (InterruptedException ex) {
Logger.getLogger(getClass().getName()).log(Level.SEVERE, null, ex);
}
}
};
t.start();
t.interrupt();
}
上面的代码,我使用for
循环来拦截带有isInterrupted()
函数的interrput标志并打印出来。调用t.interrupt()
后,isInterrupted()
将返回您将在控制台中看到的true
。一旦到达Thread.sleep(miliTime)
,您将看到InterruptedException
被抓住,如上所述被抛出。
停止线程:
您可以使用此isInterrupted()
标记检查是否在其上调用了interrupt()
并从执行中返回:
例如:
Thread t = new Thread()
{
public void run()
{
long executeTime = System.currentTimeMillis() ;
int i = 0;
for(; i<10000 && !this.isInterrupted();i++)
System.out.println("Is interrupted? "+this.isInterrupted());
System.out.println("Was Interrupted? "+this.isInterrupted()
+" after cycle: "+ i);
System.out.println("Time it gets Executed: "
+(System.currentTimeMillis() - executeTime+" ms"));
}
};
t.start();
try {
Thread.sleep(200);
} catch (InterruptedException ex) {
ex.printStackTrace();
}
t.interrupt();
运行上面的代码时:我已经将主线程发送到静态main函数内的200
睡眠状态,以允许启动的线程t
运行一段时间。然后我调用了
t.interrupt()
导致for
循环停止并打印输出如下:
Was Interrupted? true after cycle: 1477
Time it gets Executed: 258 ms
这表示for
循环在1148
函数中调用t.interrupt();
之前进行了main
次迭代。
请阅读Thread.interrupt()
功能的文档以获取更多详细信息。
答案 5 :(得分:0)
interrupt()方法不会停止Thread。 阅读本文以获取更详细的解释http://www.ibm.com/developerworks/java/library/j-jtp05236/