我应该同步对旨在中断它的Thread对象的并发访问吗?

时间:2017-07-27 14:36:31

标签: java concurrency

我有这样的代码:

class Foo {
    private final Thread mainThread = ...;
    public void start() { this.mainThread.start(); }
    public void stop() { this.mainThread.interrupt(); }
}

请注意,Foo.mainThread非常友好,可以随时检查是否被某人打断,并且如果它干净地退出。

现在在我的应用程序中有许多线程共享Foo并且可能有兴趣停止它。一切正常还是我应该偏执并声明Foo.stop()是同步方法?

1 个答案:

答案 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的操作。那太傻了。

**更简单的解决方案会同步整个方法,但可能导致过于频繁的同步。这样,我们只会同步,如果两个线程都竞争在同一时间启动一个未启动的线程,并且在此之后永远不会同步。