我已经调度了一个新线程来处理与Swing GUI相关的某些执行。但是,一旦该线程完成其任务,所有执行将停止。具体来说,在下面的代码中,最终的打印语句没有被执行。为什么会这样呢?新线程完成操作后,如何继续执行?如果这是一个愚蠢的问题,是否有任何多线程资源建议?
也有一些背景知识:我的程序同时包含JavaFX和Swing GUI,这就是第一个线程是JavaFX线程的原因。我目前正在尝试更新Swing GUI,然后继续执行。
感谢您的帮助。
System.out.println("Thread: " + Thread.currentThread());
//prints "Thread : [JavaFX Application Thread,5,main]"
new Thread(new Task<Void>(){
@Override protected Void call() throws Exception{
System.out.println("Thread: " + Thread.currentThread());
//prints "Thread : [Thread-6,5,main]"
updateData();
updateSwingGUI();
return null;
}
}).start();
System.out.println("I'm not being executed");
答案 0 :(得分:1)
如果您要阻塞当前线程,直到另一个线程完成其任务,也许在一个单独的线程上执行任务实际上是没有意义的,则您没有实现任何并行性。
您的Task
甚至没有返回任何内容,因此甚至没有其他原因可以阻塞,直到返回第二个线程的结果。
如果您仍然希望并行执行它并阻止等待任务完成,则可以使用以下方法:
System.out.println("Thread: " + Thread.currentThread());
Thread thread = new Thread(() -> {
System.out.println("Thread: " + Thread.currentThread());
updateData();
updateSwingGUI();
}).start();
System.out.println("I'm on the old thread, can do something in parallel.");
thread.join();
System.out.println("Second thread finished updating GUI.");
答案 1 :(得分:0)
println()
在原始线程上运行:一旦启动了新线程,除非您在线程之间使用某种“协调”,否则它们将同时运行,并且无法猜测语句在不同线程中的相对顺序。
如果您确实想在运行println()
之前等待第一个线程完成,请尝试执行以下操作:
System.out.println("Thread: " + Thread.currentThread());
//prints "Thread : [JavaFX Application Thread,5,main]"
// Note that we keep a reference to the thread we created.
Thread t = new Thread(new Task<Void>(){
@Override protected Void call() throws Exception{
System.out.println("Thread: " + Thread.currentThread());
//prints "Thread : [Thread-6,5,main]"
updateData();
updateSwingGUI();
return null;
}
}).start();
System.out.println("I'm not being executed");
t.join();
// We then have the original thread "join" on the thread via the reference.
join()
导致执行该语句的线程在继续经过t
之前等待线程join()
完成。
也就是说,如果您有一组线程,但是它们一次只执行一个线程(如本例所示),则会破坏线程的全部目的-允许并发执行不同的任务。 / p>