Java:如何让这个主线程等待新线程终止
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/2790196/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Java: How to make this main thread wait for the new thread to terminate
提问by Jeff Bullard
I have a java class that creates a process, called child, using ProcessBuilder. The child process generates a lot of output that I am draining on a separate thread to keep the main thread from getting blocked. However, a little later on I need to wait for the output thread to complete/terminate before going on, and I'm not sure how to do that. I think that join() is the usual way to do this but I'm not sure how to do that in this case. Here is the relevant part of the java code.
我有一个 java 类,它使用 ProcessBuilder 创建一个名为 child 的进程。子进程生成大量输出,我在单独的线程上排出这些输出,以防止主线程被阻塞。但是,稍后我需要等待输出线程完成/终止才能继续,我不知道该怎么做。我认为 join() 是执行此操作的常用方法,但我不确定在这种情况下如何执行此操作。这是java代码的相关部分。
// Capture output from process called child on a separate thread
final StringBuffer outtext = new StringBuffer("");
new Thread(new Runnable() {
public void run() {
InputStream in = null;
in = child.getInputStream();
try {
if (in != null) {
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
String line = reader.readLine();
while ((line != null)) {
outtext.append(line).append("\n");
ServerFile.appendUserOpTextFile(userName, opname, outfile, line+"\n");
line = reader.readLine();
}
}
} catch (IOException iox) {
throw new RuntimeException(iox);
}
}
}).start();
// Write input to for the child process on this main thread
//
String intext = ServerFile.readUserOpTextFile(userName, opname, infile);
OutputStream out = child.getOutputStream();
try {
out.write(intext.getBytes());
out.close();
} catch (IOException iox) {
throw new RuntimeException(iox);
}
// ***HERE IS WHERE I NEED TO WAIT FOR THE THREAD TO FINISH ***
// Other code goes here that needs to wait for outtext to get all
// of the output from the process
// Then, finally, when all the remaining code is finished, I return
// the contents of outtext
return outtext.toString();
回答by John Vint
You can join on that thread. You would get the instance of the thread and when needed to wait invoke its join method.
您可以加入该线程。您将获得线程的实例,并在需要等待时调用其 join 方法。
Thread th = new Thread(new Runnable() { ... } );
th.start();
//do work
//when need to wait for it to finish
th.join();
//th has now finished
Others will suggest a CountdownLatch, CyclicBarrier or even a Future but I find this to be easiest to implement on a very low level.
其他人会建议使用 CountdownLatch、CyclicBarrier 甚至 Future,但我发现这是在非常低的级别上最容易实现的。
回答by tangens
You have to assign your thread to a variable and later call join()on this variable.
您必须将线程分配给一个变量,然后再调用join()该变量。
回答by Binil Thomas
final StringBuffer outtext = new StringBuffer("");
Thread outputDrainThread = new Thread(new Runnable() {
public void run() {
// ...
}
}).start();
// ...
// ***HERE IS WHERE I NEED TO WAIT FOR THE THREAD TO FINISH ***
outputDrainThread.join();
// ...
return outtext.toString();

