返回執行結果的任務隊列:ExecutorCompletionService

有時候咱們須要展現一些內容,若是等全部內容都加載完畢再展現這樣反而會下降用戶體驗;
由於若是消耗時間長那麼用戶須要瞪着空白的頁面,反而會失去興趣;
因此咱們但願加載一點資源顯示一點,對於那麼超過咱們容忍範圍還未加載完畢的資源咱們應該
再也不去加載,放棄本次加載或者顯示一些默認結果dom

模擬:ide

final Random r = new Random();
		// 建立一個固定大小的線程池
		ExecutorService es = Executors.newFixedThreadPool(10);
		// 將全部處理結果提交到一個固定大小的隊列(可不指定,默認建立一個無界隊列)
		ExecutorCompletionService<String> ecs = new ExecutorCompletionService<String>(
				es,new LinkedBlockingQueue<Future<String>>(1000));
		for (int i = 0; i < 10; i++) {
			//提交全部任務
			ecs.submit(new Callable<String>() {
				@Override
				public String call() throws Exception {
					//模擬一個耗時操做
					long l = r.nextInt(4000);
					Thread.sleep(l);
					return Thread.currentThread().getName() + "|" + l;
				}
			});
			
			try {
				//得到返回結果,3s超時(表示咱們可以容忍的最大等待時間)
				System.out.println(ecs.take().get(3, TimeUnit.SECONDS));
            } catch (InterruptedException e) {
            	// 線程被中斷
            } catch (ExecutionException e) {
            	//
            	e.printStackTrace();
            } catch (TimeoutException e) {
            	// 超時,放棄這個結果
            }
			
		}
		es.shutdown();
pool-1-thread-1|884
pool-1-thread-2|3469
pool-1-thread-3|1001
pool-1-thread-4|927
pool-1-thread-5|3503
pool-1-thread-6|712
pool-1-thread-7|2015
pool-1-thread-8|2430
pool-1-thread-9|1613
pool-1-thread-10|2583
相關文章
相關標籤/搜索