国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

Callable、Future和FutureTask使用說明

2019-11-14 14:52:04
字體:
來源:轉載
供稿:網友
普通的創建線程,一種是直接繼承Thread,另外一種就是實現Runnable接口。但是這兩種都無法在執行完任務之后獲取執行結果,Callable、Future就提供了這樣的便利。
 
Future的方法說明:
 
boolean cancel(boolean mayInterruptIfRunning);
     cancel方法用來取消任務,如果取消任務成功則返回true,如果取消任務失敗則返回false。
  1. 參數mayInterruptIfRunning表示是否允許取消正在執行卻沒有執行完畢的任務,如果設置true,則表示可以取消正在執行過程中的任務。
  2. 如果任務已經完成,則無論mayInterruptIfRunning為true還是false,此方法肯定返回false,即如果取消已經完成的任務會返回false;
  3. 如果任務正在執行,若mayInterruptIfRunning設置為true,則返回true,若mayInterruptIfRunning設置為false,則返回false;
  4. 如果任務還沒有執行,則無論mayInterruptIfRunning為true還是false,肯定返回true。
boolean isCancelled();
     isCancelled方法表示任務是否被取消成功,如果在任務正常完成前被取消成功,則返回 true。
boolean isDone();
     isDone方法表示任務是否已經完成,若任務完成,則返回true;
V get() throws InterruptedException, ExecutionException;
     get()方法用來獲取執行結果,這個方法會產生阻塞,會一直等到任務執行完畢才返回;
V get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException;
     get(long timeout, TimeUnit unit)用來獲取執行結果,如果在指定時間內,還沒獲取到結果,就直接返回null。
 
而FutureTask即可以作為Runnable又可以作為Future,這樣就既可以用ExecutorService的execute執行任務,也可以用ExecutorService的submit提交任務。
 
例子1:
Callable、Future實現子線程執行任務,并返回結果,主線程等待子線程結果在進行其他邏輯。(多個子線程并行執行任務,主線程做合并處理參見CompletionService用法
 
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
 
public class CallableAndFuture1 {
 
        public static void main(String[] args) {
              ExecutorService service = Executors.newSingleThreadExecutor();
 
              Future<Integer> future = service.submit( new Callable<Integer>() {
 
                      @Override
                      public Integer call() throws Exception {
                           System. out.PRintln("子線程" + Thread.currentThread().getName() + "在進行計算");
                           Thread. sleep(3000);
 
                            int sum = 0;
                            for (int i = 0; i < 100; i++) {
                                  sum += i;
                           }
                            return sum;
                     }
              });
 
              System. out.println("主線程" + Thread.currentThread ().getName() + "在執行任務" );
 
               try {
                     System. out.println("子線程運行結果" + future.get());
              } catch (InterruptedException e) {
                     e.printStackTrace();
              } catch (ExecutionException e) {
                     e.printStackTrace();
              }
 
              System. out.println("所有任務執行完畢" );
 
       }
}

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 西乌珠穆沁旗| 南乐县| 三亚市| 高雄县| 蓬莱市| 那坡县| 大同市| 龙山县| 洛宁县| 滨海县| 临西县| 双江| 陇南市| 宜兴市| 连城县| 弋阳县| 康马县| 辽阳县| 永寿县| 西盟| 信丰县| 衡水市| 博客| 南雄市| 武胜县| 东兰县| 大田县| 侯马市| 柳江县| 德昌县| 台安县| 射洪县| 临清市| 陇川县| 若尔盖县| 揭东县| 武清区| 乌拉特前旗| 新津县| 本溪| 西安市|