【发布时间】:2018-03-08 04:12:17
【问题描述】:
我的问题是,我有一个包含 1000 条记录的数据集。我想要 3 个线程来处理这样的数据, thread1 从记录 1 到 300,thread2 从 301 到 600,依此类推。一个线程可以一次发出请求并获取 50 条记录,创建一个对象并将其放入队列中。 主线程会同时从队列中读取数据。
下面是代码,我面临的问题是recordRead变量告诉线程应该从哪里开始读取记录的起点。 但是我如何为每个线程设置不同的值,例如线程1应该是0,recordsToRead应该是300,对于thread2,recordRead应该是300,recordRead应该是300+300=600,最后一个线程应该是600,直到结尾。 页面大小=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 参数。
标签: java multithreading synchronization