※取得ExecutorService
以下是overloading,以下只列出同名的其中一個方法ExecutorService s1 = Executors.newCachedThreadPool();// 可快取的 Thread,預設idle 60 秒 ExecutorService s2 = Executors.newFixedThreadPool(3);// 固定數量的 Thread ExecutorService s3 = Executors.newSingleThreadExecutor();// 單一的 Thread ScheduledExecutorService sch1 = Executors.newScheduledThreadPool(3);// 可排程的 Thread ScheduledExecutorService sch2 = Executors.newSingleThreadScheduledExecutor();// 單一可排程的
※最後兩個可排程,但要用 ScheduledExecutorService 去接
※Executors.newFixedThreadPool(1) 等於 Executors.newSingleThreadExecutor(),看原始碼就知道,排程的也是一樣
※ScheduledExecutorService
ScheduledExecutorService 有4個方法delay配合TimeUnit的時間間隔,是設定時間用的
delay:多少時間後開始執行
<V> ScheduledFuture<V> schedule(Callable<V> callable, long delay, TimeUnit unit)
ScheduledFuture<?> schedule(Runnable command, long delay, TimeUnit unit)
以下兩個不容易分
ScheduledFuture<?> scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit)
ScheduledFuture<?> scheduleWithFixedDelay(Runnable command, long initialDelay, long delay, TimeUnit unit)
initialDelay:多少時間後開始執行,只有第一次
period、delay:第二次(含)之後看的是這個時間
period、delay不同的是
period:command 的開始時間開始算,算到 period 設定的時間為一個間隔,如果設定5秒就每5秒執行一次
delay:command 的結束時間開始算,算到 delay 設定的時間為一個間隔,如果設定5秒就每5秒加上 command 執行的時間執行一次
※排程範例
ScheduledExecutorService sch1 = Executors.newScheduledThreadPool(1);
ScheduledExecutorService sch2 = Executors.newSingleThreadScheduledExecutor();
ScheduledFuture<String> future1 = sch1.schedule(new Callable<String>() {
public String call() throws Exception {
return "xxx";
}
}, 3, TimeUnit.SECONDS);
try {
System.out.println(future1.get());
sch1.shutdown();
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
ScheduledFuture<?> future2 = sch2.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
System.out.println("哇哈哈");
}
}, 1, 1, TimeUnit.SECONDS);
try {
future2.get();
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
※注意 future2 的順序,以上面的例子是先執行3秒後的xxx,然後再執行哇哈哈
如果將 future2 放到 future1 的下面,然後在 future1.get() 下增加 future2.get(),最下面的 future2.get() 刪除,此時結果會是1秒的哇哈哈先執行
※Future 的 cancel 方法
參數是布林值,表示如果任務正在執行,是否要取消回傳是否成功取消,如果為false,通常已經正常完成
ScheduledExecutorService sch = Executors.newSingleThreadScheduledExecutor();
ScheduledFuture<?> future = sch.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
System.out.println("哇哈哈");
}
}, 1, 1, TimeUnit.SECONDS);
ScheduledFuture<?> f = sch.schedule(new Callable<Boolean>() {
public Boolean call() throws Exception {
return future.cancel(true);
}
}, 5, TimeUnit.SECONDS);
try {
// System.out.println(future.get());
System.out.println("是否取消=" + f.get());
sch.shutdown();
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
※註解打開會出「java.util.concurrent.CancellationException」的錯
沒有留言:
張貼留言