我的程序将使用线程,但是一些变量(如链接/页面的集合,有关查询的信息(如果是更新或无))和其他一些信息(布尔字段,int字段等)必须由线程共享
在这种情况下,所有线程都将处理相同的工作,但是在集合的diferrente元素中。
我想知道是否有办法做到这一点,不创建类/对象只是为了保存这些共享数据。
我的情况:我在数据库中有很多需要处理的页面,而且我无法一次性恢复所有页面。在每个线程中,我有一个布尔字段来通知是否正在使用来自数据库的链接更新页面列表。每个线程都有一个包含要处理的页面的集合。
在过去的程序中,我有类似的情况。为了解决这个问题,我创建了一个拥有这些状态的Master和从Master获得信息的Slaves。但是现在我想在没有Master的情况下做,只与Slaves一起工作,但是我需要知道是否有一种方法只为所有线程提供一个变量。
示例:如果thread1自动将某个布尔值更新为true,则所有其他线程都将此布尔值设置为true。
答案 0 :(得分:4)
如果需要在线程之间共享数据,则需要确保以 synchronized 方式共享数据,即数据结构是线程安全的。
查看java.util.concurrent
包。例如,您可以使用其中一个BlockingQueue
实现(ArrayBlockingQueue
,DelayQueue
,LinkedBlockingDeque
,LinkedBlockingQueue
,PriorityBlockingQueue
,{{ 1}})。
关于您的评论:还要查看SynchronousQueue
包。在那里,您会找到java.util.concurrent.atomic
,AtomicBoolean
,AtomicInteger
等类。
示例:如果thread1自动将某个布尔值更新为true,则所有其他线程都将此布尔值更新为true。
我建议你在这种情况下使用AtomicReference
。只要您声明AtomicBoolean
(如果您不需要比较和设置操作等), 可能也可能使用普通的boolean
。
答案 1 :(得分:0)
你可以这样做。此模式允许您安排多个并发任务,而无需一次创建太多任务。
ThreadPoolExecutor tpe = new ThreadPoolExecutor(10, 10, 10, TimeUnit.MINUTES, new LinkedBlockingQueue<Runnable>());
while(isMoreWork()) {
while(tpe.getQueue().size() > 10) {
Thread.sleep(1);
}
final String link =
tpe.submit(new Runnable() {
@Override
public void run() {
processLink(link);
}
});
}