我正在为多线程应用程序工作,所以我有一个有一个Global ArrayList变量的线程,我从数据库中获取值列表并将其分配给该变量。我已经限制了应该获取的列表数量为100个。在后端我正在使用hibernate。
我保持这个线程定期在后台运行,但是我想这样做,每当这个线程运行时,它将获取下一个100列表的项目。而且我也不想使用静态而不想在数据库中维护它,我很困惑如何维护一个计数器,告诉我的提取方法下一个要获取的项目。任何人都可以帮忙,我怎样才能做到这一点?以下是我的代码示例
public class DemoThread implements Runnable {
private ArrayList <<>> samplePojoList = null;
@Override
public void run() {
MyDaoClass dao = null;
try {
// this dao method fetching list of 100 results from database,
// for each iteration i want to fetch next 100 result from
// database
samplePojoList = dao.getSampleList();
} catch (Exception e) {}
}
}
答案 0 :(得分:1)
在这种情况下,您可以很好地使用ThreadLocal
变量。
请参阅以下示例:
private ThreadLocal<Integer> counter = new ThreadLocal<Integer>();
答案 1 :(得分:1)
以下是一个简化的示例,说明如何将计数器传递给线程并在消费者线程中维护同步计数。为了保持线程之间的计数器计数一致,应该在同步块中访问和增加它。 我的假设是你希望在所有消费者线程之间共享一个计数器,而不是每个消费者线程一个计数器。
class Counter{
int count = 0;
}
class MyThread implements Runnable {
Counter counter;
MyThread(Counter counter){
this.counter = counter;
}
public void run() {
int count;
synchronized(counter){
count = counter.count;
counter.count++;
}
// fetch 100 times the value of this counter
System.out.println(count); // just a stub code
}
}
public class CounterDemo {
public static void main(String[] args) {
Counter counter = new Counter();
MyThread t = new MyThread(counter);
new Thread(t).start();
}
}
答案 2 :(得分:0)
您可以使用AtomicReference来实现相同目标。
String
的示例代码:
String initialReference = "value 1";
AtomicReference<String> someRef =
new AtomicReference<String>(initialReference);
String newReference = "value 2";
boolean exchanged = someRef.compareAndSet(initialReference, newReference);
System.out.println("exchanged: " + exchanged);
您可以在上面的示例中将String
替换为ArrayList
。
有关详细信息,请查看此SE帖子: