一、為什麼需要等待
在Java開發中,等待的情況比比皆是。比如網絡請求需要等待服務器響應、等待用戶操作等等。等待可以使得程序的執行順序更加合理,也可以增強用戶體驗。
在等待過程中,最常見的就是等待一定時間,例如等待五秒鐘後執行某些代碼。那如何實現這個等待過程呢?
二、Thread.sleep方法
Java提供了Thread.sleep方法來實現等待。Thread是Java中的線程類,sleep方法會讓當前線程睡眠一段時間。例如下面的代碼將暫停當前線程5秒鐘。
try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); }
在使用Thread.sleep方法時,需要注意InterruptedException異常的處理。如果線程在sleep時間內被中斷,就會拋出該異常。根據業務邏輯進行相應的處理。
三、Timer類的schedule方法
除了Thread.sleep方法,Java還提供了Timer類來實現定時任務調度。Timer類有一個schedule方法,可以在指定時間執行某個任務。
下面的示例代碼將在5秒後輸出一句話。
Timer timer = new Timer(); timer.schedule(new TimerTask() { @Override public void run() { System.out.println("5秒鐘過去了!"); } },5000);
需要注意的是,Timer執行的任務是在新線程中完成的。如果需要在當前線程中執行任務,可以使用ScheduledThreadPoolExecutor類。
四、CountDownLatch類
CountDownLatch類是Java中的一個同步工具類,它可以控制線程的執行順序。CountDownLatch的構造函數中需要指定計數器的數量,當計數器的值為0時,await方法被阻塞的線程才會繼續執行。
下面的代碼將在5秒後輸出一句話:
CountDownLatch countDownLatch = new CountDownLatch(1); new Thread(() -> { try { countDownLatch.await(); System.out.println("5秒鐘過去了!"); } catch (InterruptedException e) { e.printStackTrace(); } }).start(); Thread.sleep(5000); countDownLatch.countDown();
在這個例子中,主線程會睡眠5秒鐘,然後調用countDown方法,使得計數器的值減1。子線程中的await方法會被阻塞,直到計數器的值為0。
五、ScheduledExecutorService接口的schedule方法
在Java5中,引入了ScheduledExecutorService接口,提供了更加方便的定時調度機制。其中schedule方法可以在指定時間執行某個任務。
下面的代碼將在5秒後輸出一句話:
ScheduledExecutorService executorService = Executors.newScheduledThreadPool(1); ScheduledFuture result = executorService.schedule(() -> { System.out.println("5秒鐘過去了!"); }, 5, TimeUnit.SECONDS);
ScheduledExecutorService可以通過Executors工廠類創建,該方法返回一個線程池對象。schedule方法擁有與Timer類似的功能,一樣可以在指定時間執行任務。但是ScheduledExecutorService相比Timer類更加靈活,支持多線程並發操作,任務可控制、可取消等等。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/297654.html