国产探花免费观看_亚洲丰满少妇自慰呻吟_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("所有任務執行完畢" );
 
       }
}

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 甘泉县| 曲松县| 道真| 江西省| 尉犁县| 满洲里市| 乳山市| 江山市| 翼城县| 青神县| 安泽县| 静安区| 连州市| 重庆市| 保康县| 墨竹工卡县| 上思县| 陆河县| 新邵县| 石楼县| 信宜市| 金山区| 申扎县| 青田县| 青海省| 德格县| 客服| 宁远县| 小金县| 阆中市| 汾西县| 汤原县| 福建省| 枞阳县| 沈阳市| 清水县| 宁国市| 宁晋县| 新沂市| 平邑县| 太原市|