Java多线程第二线程等待第一

时间:2019-01-17 19:07:58

标签: java multithreading

我需要来自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发出请求。

我应该在其他地方创建线程吗?

1 个答案:

答案 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.

我不知道那正是您想要的,并且我还没有包括异常检查或您可能需要的其他任何呼叫。