내 질문은, 나는 1000 레코드의 데이터 집합이있다. 나는이 같은 데이터를 처리하는 3 개의 쓰레드를 원한다. thread1은 레코드 1에서 300까지, thread2는 301에서 600으로 걸린다. 하나의 스레드가 요청을하고 한 번에 50 개의 레코드를 가져 와서 개체를 만들어 큐에 넣을 수 있습니다. 주 스레드가 대기열에서 동시에 데이터를 읽습니다.메인 스레드 소비자 및 기타 스레드 생산자
아래 코드는 내가 겪고있는 문제는 recordRead 변수가 스레드가 레코드 읽기를 시작해야하는 시작 지점을 알려줍니다. 하지만 각 스레드마다 다른 값을 설정할 수 있습니다 예를 들어 thread1에 대해 0이어야하며 recordsToRead는 300이어야하며 thread2의 경우 recordRead는 300이어야하며 300 + 300 = 600이되어야하며 마지막 스레드의 경우 recordsToRead는 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를 설정할 수 있습니까?
최소한 하나의 스레드가 객체를 대기열에 삽입 할 때까지 주 스레드를 대기시키는 방법.
'Runnable'의 하위 클래스를 클래스 ctor 매개 변수로 시작 위치 (및 그 밖의 것)를 사용하여 만들 수 있습니다. –