如何使当前线程在继续执行之前等待另一个线程完成?

时间:2019-01-14 14:26:47

标签: java multithreading

我已经调度了一个新线程来处理与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");

2 个答案:

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