19

アプリケーション内にすべてのシンボルを格納するための HashSet で構成される、アプリケーションで継続的に実行されるスレッドがあります。作成時の設計に従って、スレッドの while true 条件内で HashSet を継続的に反復し、HashSet 内に含まれるすべてのシンボルのデータベースを更新します。

HashSet 内に存在する可能性のあるシンボルの最大数は約 6000 です。一度に 6000 個のシンボルすべてで DB を更新したくありませんが、この HashSet をそれぞれ 500 個の異なるサブセット (12 セット) に分割して実行します。各サブセットを個別に処理し、各サブセットの後にスレッドを 15 分間スリープさせて、データベースへの負荷を軽減できるようにします。

これは私のコードです (サンプル コード スニペット)

セットをより小さなサブセットに分割して処理するにはどうすればよいですか (ArrayList、TreeSet を分割する例を見てきましたが、HashSet に関連する例は見つかりませんでした)。

package com.ubsc.rewji.threads;

import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import java.util.concurrent.PriorityBlockingQueue;

public class TaskerThread extends Thread {
    private PriorityBlockingQueue<String> priorityBlocking = new PriorityBlockingQueue<String>();
    String symbols[] = new String[] { "One", "Two", "Three", "Four" };
    Set<String> allSymbolsSet = Collections
            .synchronizedSet(new HashSet<String>(Arrays.asList(symbols)));

    public void addsymbols(String commaDelimSymbolsList) {
        if (commaDelimSymbolsList != null) {
            String[] symAr = commaDelimSymbolsList.split(",");
            for (int i = 0; i < symAr.length; i++) {
                priorityBlocking.add(symAr[i]);
            }
        }
    }

    public void run() {
        while (true) {
            try {
                while (priorityBlocking.peek() != null) {
                    String symbol = priorityBlocking.poll();
                    allSymbolsSet.add(symbol);
                }
                Iterator<String> ite = allSymbolsSet.iterator();
                System.out.println("=======================");
                while (ite.hasNext()) {
                    String symbol = ite.next();
                    if (symbol != null && symbol.trim().length() > 0) {
                        try {
                            updateDB(symbol);

                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                }
                Thread.sleep(2000);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    public void updateDB(String symbol) {
        System.out.println("THE SYMBOL BEING UPDATED IS" + "  " + symbol);
    }

    public static void main(String args[]) {
        TaskerThread taskThread = new TaskerThread();
        taskThread.start();

        String commaDelimSymbolsList = "ONVO,HJI,HYU,SD,F,SDF,ASA,TRET,TRE,JHG,RWE,XCX,WQE,KLJK,XCZ";
        taskThread.addsymbols(commaDelimSymbolsList);

    }

}
4

6 に答える 6

0

実際の問題に対する非常に簡単な方法は、コードを次のように変更することです。

Iterator<String> ite = allSymbolsSet.iterator();
System.out.println("=======================");
int i = 500;
while ((--i > 0) && ite.hasNext()) {

一般的な方法は、反復子を使用して、単純なループで要素を 1 つずつ取り出すことです。

int i = 500;
while ((--i > 0) && ite.hasNext()) {
  sublist.add(ite.next());
  ite.remove();
}
于 2013-10-17T10:03:43.510 に答える