日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關咨詢
選擇下列產(chǎn)品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
Java并行編程:從并行任務集獲取反饋

在并行任務啟動后,強制性地從并行任務得到反饋。

創(chuàng)新互聯(lián)公司-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設、高性價比河口網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式河口網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設找我們,業(yè)務覆蓋河口地區(qū)。費用合理售后完善,10多年實體公司更值得信賴。

假想有一個程序,可以發(fā)送批郵件,還使用了多線程機制。你想知道有多少郵件成功發(fā)送嗎?你想知道在實際發(fā)送過程期間,這個批處理工作的實時進展嗎?

要實現(xiàn)多線程的這種反饋,我們可以使用Callable接口。此接口的工作方式基本上與Runnable相同,但是執(zhí)行方法(call())會返回一個值,該值反映了執(zhí)行計算的結(jié)果。

 
 
 
  1. package com.ricardozuasti;
  2. import java.util.concurrent.Callable;
  3. public class FictionalEmailSender implements Callable{
  4.     private String to;
  5.     private String subject;
  6.     private String body;
  7.     public FictionalEmailSender(String to, String subject, String body){
  8.         this.to = to;
  9.         this.subject = subject;
  10.         this.body = body;
  11.     }
  12.     @Override
  13.     public Boolean call() throws InterruptedException {
  14.         // 在0~0.5秒間模擬發(fā)送郵件
  15.         Thread.sleep(Math.round(Math.random()*0.5*1000));
  16.         // 假設我們有80%的幾率成功發(fā)送郵件
  17.         if(Math.random()>0.2){
  18.             return true;
  19.         }else{
  20.             return false;
  21.         }
  22.     }
  23.     
  24. }

注意:Callable接口可用于返回任意數(shù)據(jù)類型,因此我們的任務可以返回我們需要的任何信息。

現(xiàn)在,我們使用一個線程池ExecutorService來發(fā)送郵件,由于我們的任務是以Callable接口實現(xiàn)的,我們提交執(zhí)行的每個新任務,都會得到一個Future引用。注意我們要使用直接的構(gòu)造器創(chuàng)建ExecutorService,而不是使用來自Executors的工具方法創(chuàng)建。這是因為使用指定類ThreadPoolExecutor提供了一些方法可以派上用場。

 
 
 
  1. package com.ricardozuasti;
  2. import java.util.concurrent.Future;
  3. import java.util.concurrent.LinkedBlockingQueue;
  4. import java.util.concurrent.ThreadPoolExecutor;
  5. import java.util.concurrent.TimeUnit;
  6. import java.util.ArrayList;
  7. import java.util.List;
  8. public class Concurrency2 {
  9.     public static void main(String[] args){
  10.         try{
  11.             ThreadPoolExecutor executor = new ThreadPoolExecutor(30, 30, 1,
  12.      TimeUnit.SECONDS, new LinkedBlockingQueue());
  13.             List> futures = new ArrayList>(9000);
  14.             // 發(fā)送垃圾郵件, 用戶名假設為4位數(shù)字
  15.             for(int i=1000; i<10000; i++){
  16.                 futures.add(executor.submit(new FictionalEmailSender(i+"@sina.com",
  17.                         "Knock, knock, Neo", "The Matrix has you...")));
  18.             }
  19.             // 提交所有的任務后,關閉executor
  20.             System.out.println("Starting shutdown...");
  21.             executor.shutdown();
  22.             
  23.             // 每秒鐘打印執(zhí)行進度
  24.             while(!executor.isTerminated()){
  25.                 executor.awaitTermination(1, TimeUnit.SECONDS);
  26.                 int progress = Math.round((executor.getCompletedTaskCount()
  27. *100)/executor.getTaskCount());
  28.                 System.out.println(progress + "% done (" + 
  29. executor.getCompletedTaskCount() + " emails have been sent).");
  30.             }
  31.             // 現(xiàn)在所有郵件已發(fā)送完, 檢查futures, 看成功發(fā)送的郵件有多少
  32.             int errorCount = 0;
  33.             int successCount = 0;
  34.             for(Future future : futures){
  35.                 if(future.get()){
  36.                     successCount++;
  37.                 }else{
  38.                     errorCount++;
  39.                 }
  40.             }
  41.             System.out.println(successCount + " emails were successfully sent, but " +
  42.                     errorCount + " failed.");
  43.         }catch(Exception ex){
  44.             ex.printStackTrace();
  45.         }
  46.     }
  47. }

執(zhí)行這個類,輸出結(jié)果如下:

 
 
 
  1. Starting shutdown...
  2. 1% done (118 emails have been sent).
  3. 2% done (232 emails have been sent).
  4. 3% done (358 emails have been sent).
  5. 5% done (478 emails have been sent).
  6. 6% done (587 emails have been sent).
  7. 7% done (718 emails have been sent).
  8. 9% done (850 emails have been sent).
  9. 10% done (969 emails have been sent).
  10. ……

所有的任務都由ExecutorService提交,我們開始它的關閉(防止提交新任務)并使用一個循環(huán)(實時場景,可能你會繼續(xù)做其它的事情)來等待,直至所有任務都被執(zhí)行完成、計算和打印當前每次迭代的進度。

注意,你可以存儲executor引用,也可以在任意時間從其它線程查詢它的計算結(jié)果和報告進程進度。

最后,使用Future集合引用,我們得到ExecutorService提交的每個Callable接口,通知成功發(fā)送的郵件數(shù)量和發(fā)送失敗的郵件數(shù)量。

此結(jié)構(gòu)不但易于使用,還使得相關性得到清晰的隔離,在調(diào)度程序和實際任務之間提供了一個預定義的通信機制。


當前題目:Java并行編程:從并行任務集獲取反饋
鏈接URL:http://www.dlmjj.cn/article/dhhsips.html