连续调用方法时如何异步延迟?

San*_*Kim 5 java delay

我希望在调用该方法之前延迟 1 分钟printFirst()而不影响主线程。

代码

我试过

// define delaying print-method using Timer
static void printFirst() {
  new java.util.Timer().schedule(
    new java.util.TimerTask() {
      public void run() {
        System.out.println(ts() + " First");
      }
    },60000
  );
}

// main to run
System.out.println(ts() + " Zero");
printFirst();
printFirst();
printFirst();
System.out.println(ts() + " Second");
System.out.println(ts() + " Third");
System.out.println(ts() + " Fourth");
Run Code Online (Sandbox Code Playgroud)

实际产量

但输出是

Timestamp: 2023-01-05 17:40:43.664 Zero
Timestamp: 2023-01-05 17:40:43.666 Second
Timestamp: 2023-01-05 17:40:43.667 Third
Timestamp: 2023-01-05 17:40:43.667 Fourth
Timestamp: 2023-01-05 17:41:13.681 First
Timestamp: 2023-01-05 17:41:13.681 First
Timestamp: 2023-01-05 17:41:13.681 First
Run Code Online (Sandbox Code Playgroud)

预期的

我预计以“First”结尾的 3 行之间有 1 分钟的间隔。

Timestamp: 2023-01-05 17:40:43.664 Zero
Timestamp: 2023-01-05 17:40:43.666 Second
Timestamp: 2023-01-05 17:40:43.667 Third
Timestamp: 2023-01-05 17:40:43.667 Fourth
Timestamp: 2023-01-05 17:41:43.667 First
Timestamp: 2023-01-05 17:42:43.667 First
Timestamp: 2023-01-05 17:43:43.667 First
Run Code Online (Sandbox Code Playgroud)

小智 4

我们可以使用 ExecutorService 类的 newSingleThreadExecutor() 方法达到预期的结果。请参阅下面的代码。

static ExecutorService es = Executors.newSingleThreadExecutor();

static void printFirst() {
    es.submit(() -> {
        try {
            TimeUnit.MILLISECONDS.sleep(60000);
            System.out.println(ts() + " First");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    });
}
Run Code Online (Sandbox Code Playgroud)

主要方法还是一样的。

System.out.println(ts() + " Zero");
printFirst();
printFirst();
printFirst();
System.out.println(ts() + " Second");
System.out.println(ts() + " Third");
System.out.println(ts() + " Fourth");
Run Code Online (Sandbox Code Playgroud)

运行时,结果为:

2023-01-06 00:05:45.72 Zero
2023-01-06 00:05:45.763 Second
2023-01-06 00:05:45.763 Third
2023-01-06 00:05:45.763 Fourth
2023-01-06 00:06:45.776 First
2023-01-06 00:07:45.782 First
2023-01-06 00:08:45.784 First
Run Code Online (Sandbox Code Playgroud)

  • 这很棒!我只是认为它在打印行之后缺少 es.shutdown() 来释放资源 (2认同)