私の質問は、私は1000レコードのデータセットがあります。私はこのようなデータを処理する3つのスレッド、 スレッド1をレコード1から300、スレッド2を301から600のようにしたい。 1つのスレッドは、一度に50レコードを要求してフェッチし、オブジェクトを作成してキューに入れることができます。 メインスレッドは同時にキューからデータを読み込みます。メインスレッドのコンシューマと他のスレッドのプロデューサ
以下はコードですが、私が直面している問題はrecordRead変数がレコードの読み込みを開始する場所の開始点を示していることです。 しかし、スレッドごとに異なる値を設定するにはどうすればいいですか?例えばthread1の場合は0、recordsToReadの場合は300、thread2の場合はrecordReadは300、recordsToReadの場合は300 + 300 = 600、最後のスレッドの場合は600となります。終わり。 pagesize = 50 pagesize、recordRead、recordToReadはすべてメインクラスとメインスレッドに属する変数です。
ExecutorService service = Executors.newFixedThreadPool(nThreads);
while(nThreads > 0) {
nThreads--;
service.execute(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
do {
int respCode = 0;
int RecordsToRead = div;
JSONObject jsObj = new JSONObject();
jsObj.put("pagesize", pageSize);
jsObj.put("start", recordsRead);
jsObj.put("searchinternalid", searchInternalId);
try {
boolean status = req.invoke(jsObj);
respCode = req.getResponseCode();
} catch (Exception e) {
req.reset();
e.printStackTrace();
return true;
}
JSONObject jsResp = req.getResponseJson();
//here jsResp will be added to ArrayBlockingQueue.
req.reset();
}while(!isError && !isMaxLimit && recordsRead < RecordsToRead);
}
});
}
このループの後、キューを読み取るメインスレッドのコードになります。 すべてのスレッドに対してrecordsReadとrecordToreadを設定する方法はありますか。
少なくとも1つのスレッドがオブジェクトをキューに挿入するまでメインスレッドを待機させる方法。
'Runnable'のサブクラスを、クラスctorパラメータとして開始位置(およびその他のもの)を使って作成できます。 –