在java中维护线程中变量的值

时间:2016-05-20 04:14:23

标签: java multithreading hibernate

我正在为多线程应用程序工作,所以我有一个有一个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) {}
    }
}

3 个答案:

答案 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帖子:

When to use AtomicReference in Java?