是否可以在几个线程之间共享一个变量而不是所有线程?

时间:2016-08-13 16:35:40

标签: java spring multithreading thread-safety

我从第三方API提取数据,我想知道是否有可能在某些线程之间共享变量,但不是所有线程之间。

示例:

我有2个用户,我为每个用户开始2个线程。让我们说用户1的线程A,B和用户2的线程C,D。现在我需要某种标志来通知线程何时停止(让我们说已经读取的页面总数,因用户而异) 。问题是,必须为属于此特定用户的2个线程同步该标志,而不是其他线程。我无法修改用户实体。创建2个标志是不可选的,因为这只是一个示例,实际上可能有多个用户提取他们的数据。

这可能吗?如果是,那怎么办?

感谢您的时间。

3 个答案:

答案 0 :(得分:1)

使用布尔标志创建和对象,并将其传递给构造函数中同一用户的2个线程并将其存储在字段中

答案 1 :(得分:1)

为用户创建线程时,还要创建需要共享的标志并将其传递给线程,以便他们可以使用它并共享信息

类似的东西:

AtomicBoolean userFlag = new AtomicBoolean(false);
Runnable a = new UserRunnable(userFlag);
Runnable b = new UserRunnable(userFlag);
// run a and b

UserRunnable

public class UserRunnable implements Runnable {
    private final AtomicBoolean flag;
    // + constructor

    @Override
    public void run() {
        // use the flag
    }
}

答案 2 :(得分:1)

  

是否可以在几个线程之间共享一个变量而不是所有线程?

这取决于你所说的“分享”。程序中的所有线程都在同一个虚拟地址空间中运行。任何线程都可以访问内存中的任何对象,但这并不意味着每个线程都有来访问每个对象。

线程会执行您为其编写的代码,告诉他们这样做。如果你想要两个不同的线程来查看两个不同的标志,那么为它们编写代码来查看两个不同的标志。或者,编写一个在其构造函数中接受Flag对象的类,然后对两个线程使用相同的类,但使用通过引用不同Flag对象构造的不同实例。