我从第三方API提取数据,我想知道是否有可能在某些线程之间共享变量,但不是所有线程之间。
示例:
我有2个用户,我为每个用户开始2个线程。让我们说用户1的线程A,B和用户2的线程C,D。现在我需要某种标志来通知线程何时停止(让我们说已经读取的页面总数,因用户而异) 。问题是,必须为属于此特定用户的2个线程同步该标志,而不是其他线程。我无法修改用户实体。创建2个标志是不可选的,因为这只是一个示例,实际上可能有多个用户提取他们的数据。
这可能吗?如果是,那怎么办?
感谢您的时间。
答案 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
对象构造的不同实例。