Java 我应该同步对线程对象的并发访问以中断它吗?
我有这样的代码:Java 我应该同步对线程对象的并发访问以中断它吗?,java,concurrency,Java,Concurrency,我有这样的代码: class Foo { private final Thread mainThread = ...; public void start() { this.mainThread.start(); } public void stop() { this.mainThread.interrupt(); } } 请注意,Foo.mainThread非常友好,可以不时检查它是否被人打断,如果被人打断,它会干净地退出 现在,在我的应用程序中,有许多线程共享Foo
class Foo {
private final Thread mainThread = ...;
public void start() { this.mainThread.start(); }
public void stop() { this.mainThread.interrupt(); }
}
请注意,Foo.mainThread
非常友好,可以不时检查它是否被人打断,如果被人打断,它会干净地退出
现在,在我的应用程序中,有许多线程共享Foo
,并且可能有兴趣停止它。一切正常吗?还是我应该偏执并声明Foo.stop()
为同步方法?基本上只是设置了一个标志。某些操作,例如Thread.sleep
将导致检查此标志,如果该标志设置为true,则会引发异常
如果你在处理
正确地说*,没有理由两个线程都设置标志会有问题
所以不用了。不要麻烦同步停止
不过,您可能确实希望同步启动
。两次启动线程将导致非法ThreadStateException
。我会像这样重新编写该函数**:
private boolean started = false;
public void start()
{
if (started) return;
synchronized(this)
{
if (!started)
{
this.mainThread.start();
started = true;
}
}
}
这里有一篇很好的文章
*“正确”的意思是不要做任何奇怪的事情,比如在处理InterruptedException
时执行可能引发InterruptedException
的操作。那太傻了
**更简单的解决方案将同步整个方法,但可能会导致同步过于频繁。通过这种方式,我们只在两个线程同时竞争启动一个未启动的线程时才进行同步,之后再也不会同步。a1、a2、a3线程都共享一个Foo线程。然后是b1,它有自己的一个foo线程。然后是一个c1,它有一个Foo线程。我对你的理解正确吗?