我的程序将使用线程,但一些变量,如链接/页面的集合,查询信息(如果正在更新或没有)和其他一些信息(布尔字段,int字段等)必须由线程共享。
在这种情况下,所有线程将处理相同的工作,但在集合的不同元素中。
我想知道是否有一种方法可以做到这一点,而不是创建一个类/对象只保存这些共享数据。
我的情况:我在数据库中有很多页面需要处理,我不能一次恢复所有页面。在每个线程中,我有一个布尔字段来通知页面列表是否正在使用数据库中的链接更新。每个线程都有一个要处理的页面集合。
在过去的一个程序中,我遇到过类似的情况。为了解决这个问题,我创建了一个包含这些状态的主服务器和从服务器获取信息的从服务器。但现在我想做没有主人,只与奴隶工作,但我需要知道是否有一种方法,只有一个变量的所有线程。
示例:如果thread1将某个布尔值更新为true,则所有其他线程自动将该布尔值设置为true。
如果你需要在线程之间共享数据,你需要确保它是以同步的方式共享的,也就是说,数据结构是线程安全的。
看一下java.util.concurrent
包。例如,您可以使用BlockingQueue
实现之一(ArrayBlockingQueue
, DelayQueue
, LinkedBlockingDeque
, LinkedBlockingQueue
, PriorityBlockingQueue
, SynchronousQueue
)。
关于你的评论:也看看java.util.concurrent.atomic
包。在那里你会发现AtomicBoolean
、AtomicInteger
、AtomicReference
等类。
示例:如果thread1将某个布尔值更新为true,那么所有其他线程都会自动将该布尔值设置为true
我建议你在这种情况下使用AtomicBoolean
。你可以也可以使用普通的boolean
,只要你声明它volatile
(如果你不需要比较和设置操作等)。
您可以这样做。此模式允许您调度多个并发任务,而不会一次创建太多任务。
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);
}
});
}