【发布时间】:2017-11-07 13:01:16
【问题描述】:
假设我有 n 个线程同时从共享队列中获取值:
public class WorkerThread implements Runnable{
private BlockingQueue queue;
private ArrayList<Integer> counts = new ArrayList<>();
private int count=0;
public void run(){
while(true) {
queue.pop();
count++;
}
}
}
然后对于每个线程,我想每 5 秒计算一次它有多少项已出队,然后将其存储在自己的列表中(计数) 我在这里看到Print "hello world" every X seconds 如何每 x 秒运行一次代码:
Timer t = new Timer();
t.scheduleAtFixedRate(new TimerTask(){
@Override
public void run(){
counts.add(count);
count = 0
}
}, 0, 5000);
问题是我无法访问计数变量和计数列表,除非它们是静态的。但我不希望它们是静态的,因为我不希望不同的线程共享这些变量。
关于如何处理这个问题的任何想法?
【问题讨论】:
-
将
Timer t = ...代码块放在while (true)上方编译(除了你需要.take而不是.pop),所以一切都应该没问题。但是由于定时器任务会在另一个线程中执行,所以使用AtomicInteger count和getAndSet(0)方法。 -
在任务执行期间或完成后,您在运行时是否需要此信息?
-
如果我把 Timer t=... 放在 while 上面,如果我只使用 1 个线程,它会起作用。我想使用 n 个线程。例如,我有线程 1 和线程 2。然后在 5 秒内,线程 1 从队列中取了 1000 个值,线程 2 取了 1100。我需要线程 1 将 1000 存储在自己的列表中,线程 2 将 1100 存储在也有自己的清单。我不想在线程之间共享计数变量。我需要在任务执行期间收集这些信息。完成后我需要它,只是为了检查线程在执行过程中的工作是否大致相同。
-
@Mr.Liu 它将完全按照您的描述工作,对于多个线程以及单个线程 - 每个
Runnable将有自己的count。
标签: java multithreading