Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我应该同步对线程对象的并发访问以中断它吗?_Java_Concurrency - Fatal编程技术网

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线程。我对你的理解正确吗?