2016-08-13 47 views
0

我从第三方API提取数据,我想知道是否可以在一些线程之间共享变量,但不是全部。是否可以在少数线程之间共享一个变量,但不是全部?

实施例:

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

这可能吗?如果是,那么如何?

谢谢你的时间。

回答

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 
    } 
} 
+0

我想这也将工作,如果我创建一个持有2个整数的对象并使用线程内的同步{}块访问它们(在run方法中)?它将仅在包含对该对象的特定引用的线程之间同步。那是对的吗? – Sikor

1

只需创建并与布尔标志对象并将其传递到2个线程在构造相同的用户并将其存放在一个领域

+0

指出我正确的方向。谢谢。 – Sikor

1

是否有可能分享几个线程,但不是所有的人之间的变量?

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

线程可以做任何你为他们写的代码告诉他们做的事情。如果你想让两个不同的线程查看两个不同的标志,那么为它们编写代码,查看两个不同的标志。或者,编写一个接受其构造函数中的对象的类,然后对两个线程使用相同的类,但使用不同的实例构建并引用不同的对象。

+0

是的,我对多线程有点新,我不知何故认为如果我在一个线程中声明一个对象,那么它将与所有线程同步,不管该实例如何。现在我想知道为什么我会这么想。有用的信息tho。感谢您的输入。 – Sikor

相关问题