2016-05-20 16 views
1

私はマルチスレッドアプリケーションのために働いていますので、グローバルArrayList変数を1つ持つスレッドがあり、データベースから値のリストをフェッチしてその変数に割り当てています。私はどのくらいのリストをフェッチする必要があります100に制限しています。バックエンドで私は休止状態を使用しています。Javaのスレッド内の変数のメインテナンス値

私はこのスレッドをバックグラウンドで定期的に実行していましたが、このスレッドが実行されるたびに次の100個のアイテムのリストを取得します。また、私は静的を使用したくないし、データベースでそれを維持したくない、私はフェッチする方法を教えてくれるカウンタを維持する方法を混乱させる次の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

私はあなたが静的使用したくない知っているが、なぜ単に同期getInstanceメソッドでシングルトンを作ってみませんか? – inafalcao

+0

@inafalcao。 NO。シングルトンには多くの問題があり、関連する同期は困難です。通常、コンストラクタにパラメータを追加し、関連するものを渡す方がずっと優れています。 –

+0

質問 - あなたのスレッドが終了し、それからあなたはそれを再提出しますか?それは継続的に実行されていませんか?カーソルを使って何かをやっていない限り、どこかで変数を渡してデータベースに渡す必要があるでしょう(それはカーソルで何かをしない限り、やや異なる問題です)。パラメータもスレッドに渡します。ああ、サイドノート:データベースには、実際には「次の」または「前の」という概念自体がありません。注文するかどうかを指定する必要があります。 –

答えて

1

この場合、ThreadLocal変数を使用することができます。

以下の例を参照してください:ここでは

private ThreadLocal<Integer> counter = new ThreadLocal<Integer>(); 
+0

この変数をローカルまたはグローバルな? –

+0

グローバル変数 – shankarsh15

+0

グローバルでは???私は静的について聞いただけです...説明したいですか? – RahulCoffee

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(); 
    } 
} 
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); 

あなたは上記の例ではArrayListStringを置き換えることができます。

は、より多くの詳細については、このSEの記事を見てください:

When to use AtomicReference in Java?

関連する問題