我有这样的代码:
class Foo {
private final Thread mainThread = ...;
public void start() { this.mainThread.start(); }
public void stop() { this.mainThread.interrupt(); }
}
请注意,Foo.mainThread
非常友好,可以随时检查是否被某人打断,并且如果它干净地退出。
现在在我的应用程序中有许多线程共享Foo
并且可能有兴趣停止它。一切正常还是我应该偏执并声明Foo.stop()
是同步方法?
答案 0 :(得分:4)
Thread.interrupt
基本上只是设置一个标志。某些操作(例如Thread.sleep
)将导致检查此标志,如果该标志设置为true,则抛出异常。
如果您正在处理InterruptedException
正确*,没有理由为什么两个线程都设置标志将是一个问题。
所以没有。不要打扰同步stop
。
但您可能确实希望同步start
。两次启动线程将导致IllegalThreadStateException
。我重新写了这个函数**:
private boolean started = false;
public void start()
{
if (started) return;
synchronized(this)
{
if (!started)
{
this.mainThread.start();
started = true;
}
}
}
这是一篇很好的文章explains how Thread.interrupt
works。
*'正确'我的意思是不要做任何奇怪的事情,比如在你处理InterruptedException
时执行可以抛出InterruptedException
的操作。那太傻了。
**更简单的解决方案会同步整个方法,但可能导致过于频繁的同步。这样,我们只会同步,如果两个线程都竞争在同一时间启动一个未启动的线程,并且在此之后永远不会同步。