我需要来自Web API的信息,用户只需要查看前1,000个寄存器,其余(最多120,000个)必须存储在本地数据库中。获取120,000个寄存器需要花费大量时间,而只有1,000个不是那么多,所以我需要2个线程,一个线程用于所有线程,另一个线程仅用于1,000个线程。 一旦线程1,000结束,servlet就应该返回到前端,并且带有所有信息的线程应该继续工作。
runnable R1 = new runnable( "Thread-1", user, parentQuery, Integer.parseInt(nodeId), overlaping);
runnable R2 = new runnable( "Thread-2", user, parentQuery, Integer.parseInt(nodeId), overlaping);
R1.start();
R2.start();
List<List<pat>> fList = R1.getLists();
List<List<pat>> fList2 = R2.getLists();
while(true) {
if(R1.getState().equals("TERMINATED")) {
notExpiredThread = fList.get(0);
almostExpiredThread = fList.get(1);
expiredThread = fList.get(2);
break;
}
}
while(true) {
if(R2.getState().equals("TERMINATED")) {
notExpired = fList2.get(0);
almostExpired = fList2.get(1);
expired = fList2.get(2);
break;
}
}
如果我不设置while,那么即使线程仍在运行,代码也会立即尝试从fList和fList2获取列表。
runnable getLists()仅向API发出请求。
我应该在其他地方创建线程吗?
答案 0 :(得分:0)
很难确定,但我认为您想要的是Thread.join()
。
上面没有任何代码等待线程结束,尽管如果结构有所不同,循环也可以做到这一点。但我认为您想要的更像是这样:
runnable R1 = new runnable( "Thread-1", user, parentQuery, Integer.parseInt(nodeId), overlaping);
runnable R2 = new runnable( "Thread-2", user, parentQuery, Integer.parseInt(nodeId), overlaping);
R1.start();
R2.start();
R1.join(); // wait until R1 is finished.
// ... do whatever you want now that R1 is complete; R2 continues to run
// if you want to wait until R2 is done, you could join here, or just check its status.
我不知道那正是您想要的,并且我还没有包括异常检查或您可能需要的其他任何呼叫。