抱歉我的英文。
我有一个带方法的线程:
@Override
public void run()
{
try
{
System.out.println( "Hello world" );
Thread.sleep( 10 );
}
catch( InterruptedException e )
{
e.printStackTrace();
}
finally
{
while( true )
System.out.println( "FINALLYYY" );
}
}
我建议,这个帖子永远不能停止! 在调用方法中断或停止后 - 在最后块中线程将启动无限循环。
我如何强制线程停止?
答案 0 :(得分:1)
线程停止和中断方法不是解决此问题的最佳方法。在线程中添加一个布尔变量,并在while语句中进行检查。
例如:
private volatile boolean keepGoing = true;
public void stopTheThread() {
keepGoing = false;
}
@Override
public void run()
{
try
{
System.out.println( "Hello world" );
Thread.sleep( 10 );
}
catch( InterruptedException e )
{
e.printStackTrace();
}
finally
{
while( keepGoing )
System.out.println( "FINALLYYY" );
}
}
答案 1 :(得分:1)
所以... 我找到了下一个解决方案:
worker.interrupt();
while( worker.isAlive() )
worker.stop();
这不是理想的解决方案,但就我而言,它是最好的...... 每次调用worker.stop - 抛出未经检查的异常" ThreadDeath"并且每个最终的区块都会被滑雪" 它应该停止线程。
答案 2 :(得分:0)
在当前设置中,您可以通过调用正在执行的interrupt()
上的Thread
方法来停止该线程。
无论哪种方式,为了允许Thread正常终止,你必须暴露一种终止该线程的方法,通过暴露线程以便它可以被中断,或者通过提供的方式提供一个'kill switch'。大卫十霍夫。
答案 3 :(得分:0)
您可以尝试控制用户线程的执行方式(至少在您控制用户线程执行时)。例如,您可以使用并发包中的 Future (不要忘记处理异常):
ExecutorService executor = Executors.newSingleThreadExecutor();
Future task = executor.submit(usersThread);
try {
task.get(1, TimeUnit.MINUTES);
} finally {
task.cancel(true);
}
如果无法控制线程内的代码,则可以控制从中使用的代码。例如,考虑以下方法: