使线程休眠,直到完成其他工作

时间:2019-02-03 09:11:40

标签: java

我的应用程序启动,它将在其中自动创建一些数据库表(如果不存在)并在这些表中创建一些默认值(使用swingworker在后台执行此操作)。然后应用程序继续并从那些表中读取一些数据,我需要第二个过程(从那些表中读取)等待几秒钟,直到从上一步创建表为止。 我用过Thread.sleep(2000);但是在NetBeans中不接受它,因为当我打开像formWindowOpened(java.awt.event.WindowEvent evt)这样的窗口时,这是堆 我该怎么办?

3 个答案:

答案 0 :(得分:0)

java.util.concurrent比Swing工作者更具便携性。

使用执行程序“单线程”确保作业是连续的,并尽快执行。

import java.sql.Connection;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

class DatabaseLayer {

   private Connection _connection;

   public DatabaseLayer( /* some args here */ ) {
      // _connection = ... use args
      final ExecutorService executor = Executors.newSingleThreadExecutor();
      executor.submit( this::create );
      executor.submit( this::read );
   }

   void create() {
      _connection = null;
      System.err.println( "Create database..." );
   }

   void read() {
      System.err.println( "Read database..." );
   }
}

public class Main /* extends swing JFrame or javafx Application */ {

   private DatabaseLayer _dbLayer;

   public void start() {
      _dbLayer = new DatabaseLayer(
         /* get parameters from properties file or command line */);
   }

   public static void main( String[] args ) {
      // create user interface from args
   }
}

您可以使用其他软件包:

  • db层:几个类
  • 应用逻辑:每个业务逻辑转换一个
  • 演示:您可以在桌面(swing或javafx)或Web ui之间进行选择

答案 1 :(得分:0)

更好的方法是使用CompletableFuture(Java 8),通过此API,您可以链接执行并仍然使用单独的线程-> https://www.baeldung.com/java-completablefuture

答案 2 :(得分:0)

实际上,我找到了一种解决问题的简便方法,我只是在类中手动创建了一个JFrame,该类正在创建表,然后对其进行处理,就像该主线程以连续的方式继续正常工作一样。