我有一个很长的任务,会有一个专门的线程,比如:
public static class WorkerThread extends Thread{
@Override public void run () {
for (int i = 1; i<=10; i++) {
System.out.println("worker thread progress: " + i + "/10");
try{Thread.sleep(1000);} catch (InterruptedException ignore) {}
}
System.out.println("the worker thread HAS FINISHED!");
}
}
在此任务期间,我想听听用户取消长任务的命令行。由于 System.in 的特殊性,代码如下(也就是说,如果您想要可中断的控制台读取,则必须使用轮询):
public static class InputThread extends Thread {
@Override public void run() {
try{
StringBuilder sb = new StringBuilder();
do {
while (System.in.available()==0) { Thread.sleep(200); }
sb.append((char)System.in.read());
} while (!sb.toString().equals("cancel\n"));
System.out.println("the user-input thread HAS FINISHED!");
} catch (IOException ignored) {} catch (InterruptedException ie) {}
}
}
好的,现在让我们使用这两个线程。案例有:
- WorkerThread 在 InputThread 之前完成。在这种情况下,我必须(优雅地)中断 InputThread,因为用户不再有可能取消线程
- InputThread 在 WorkerThread 之前完成。用户已输入“取消”命令,因此我必须(优雅地)中断 WorkerThread
优雅地说,我的意思是代码当然必须是可中断的,但这不是问题的重点。问题是:在我启动了两个线程之后,我如何等待“第一个完成”?
public static void main (String [] args) throws InterruptedException {
InputThread it = new InputThread();
it.start();
WorkerThread wt = new WorkerThread();
wt.start();
}