0

我的程序将使用线程,但一些变量,如链接/页面的集合、有关查询的信息(如果正在更新或没有)和其他一些信息(布尔字段、整数字段等)必须由线程共享。

在这种情况下,所有线程将处理相同的工作,但在集合的不同元素中。

我想知道是否有一种方法可以做到这一点,而不仅仅是创建一个类/对象来保存这些共享数据。

我的情况:我的数据库中有很多页面需要处理,我无法一次全部恢复。在每个线程中,我都有一个布尔字段来通知页面列表是否正在使用来自数据库的链接进行更新。每个线程都有一个包含要处理的页面的集合。

在过去的节目中,我有类似的情况。为了解决这个问题,我创建了一个持有这些状态的 Master 和从 Master 那里获取信息的 Slave。但是现在我想不使用 Master,只使用 Slave,但我需要知道是否有一种方法可以让所有线程只有一个变量。

示例:如果 thread1 自动将某个布尔值更新为 true,则所有其他线程都将此布尔值设为 true。

4

2 回答 2

4

如果您需要在线程之间共享数据,您需要确保以同步方式共享数据,即数据结构是线程安全的。

看看java.util.concurrent包装。例如,您也许可以使用其中一种BlockingQueue实现(ArrayBlockingQueue, DelayQueue, LinkedBlockingDeque, LinkedBlockingQueue, PriorityBlockingQueue, SynchronousQueue)。


关于您的评论:也请看一下java.util.concurrent.atomic包装。在那里您会找到诸如AtomicBooleanAtomicInteger等的类AtomicReference


示例:如果 thread1 自动将某个布尔值更新为 true,则所有其他线程都将此布尔值设为 true。

我建议你AtomicBoolean在这种情况下使用。只要您声明它,您大概也可以使用普通的(如果您不需要比较和设置操作等)。booleanvolatile

于 2011-07-18T19:33:58.623 回答
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);
        }
    });
}
于 2011-07-18T20:17:20.923 回答