幸运飞艇停吗

ASP源碼.NET源碼PHP源碼JSP源碼JAVA源碼DELPHI源碼PB源碼VC源碼VB源碼Android源碼
當前位置:首頁 >> 網絡編程 >> 其他編程教程 >> 多線程任務計算

多線程任務計算

來源:網絡整理     時間:2018-11-01     關鍵詞:

幸运飞艇停吗 BENPIANWENZHANGZHUYAOJIESHAOLE" DUOXIANCHENGRENWUJISUAN",ZHUYAOSHEJIDAOFANGMIANDENEIRONG,DUIYUQITABIANCHENGJIAOCHENGGANXINGQUDETONGXUEKEYICANKAOYIXIA: ZUIJINZAIYANJIUDUOXIANCHENGRENWUJISUANKEYIYOUFANHUIZHI,SUOYIXIELEYIGEJIANDANDUOXIANCHENGRENWUJISUANDEdemo,DAIMARUXIA:package thread;import java.util.Arr...

ZUIJINZAIYANJIUDUOXIANCHENGRENWUJISUANKEYIYOUFANHUIZHI,SUOYIXIELEYIGEJIANDANDUOXIANCHENGRENWUJISUANDEdemo,DAIMARUXIA:

package thread;
 
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.FutureTask;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
 
public class DuoRenWuJiSuanTest {
    
    public static void main(String[] args) throws Exception {
    	long startTime = System.currentTimeMillis();
        // 創建任務集合
        List<FutureTask<Integer>> taskList = new ArrayList<FutureTask<Integer>>();
        // 創建線程池
        ExecutorService exec = Executors.newFixedThreadPool(5);
        for (int i = 0; i < 10; i++) {
            // 傳入Callable對象創建FutureTask對象
            FutureTask<Integer> ft = new FutureTask<Integer>(new ComputeTask(i+""));
            taskList.add(ft);
            // 提交給線程池執行任務,也可以通過exec.invokeAll(taskList)一次性提交所有任務;
            exec.submit(ft);
        }
        
        System.out.println("所有計算任務提交完畢, 主線程接著干其他事情!");
 
        // 開始統計各計算線程計算結果
        Integer totalResult = 0;
        for (FutureTask<Integer> ft : taskList) {
            try {
                //FutureTask的get方法會自動阻塞,直到獲取計算結果為止
                totalResult = totalResult + ft.get();
//                totalResult = totalResult + ft.get(1000,TimeUnit.MILLISECONDS);//等待一秒獲取結果,子線程沒有執行完則拋出異常
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (ExecutionException e) {
                e.printStackTrace();
            }
        }
        long endTime = System.currentTimeMillis();
        // 關閉線程池
        exec.shutdown();
        System.out.println("多任務計算后的總結果是:" + totalResult+";話費時間:"+(endTime-startTime));
 
    }
}

class ComputeTask implements Callable<Integer> {
	 
    private Integer result = 0;
    private String taskName = "";
    
    public ComputeTask(String taskName){
        this.taskName = taskName;
        System.out.println("生成子線程計算任務: "+taskName);
    }
    
    public String getTaskName(){
        return this.taskName;
    }
    
    @Override
    public Integer call() throws Exception {
        for (int i = 1; i <= 100; i++) {
            result += i;
        }
        // 休眠5秒鐘,觀察主線程行為,預期的結果是主線程會繼續執行,到要取得FutureTask的結果是等待直至完成。
        Thread.sleep(new Random().nextInt(5000));
        System.out.println(Thread.currentThread().getName()+"子線程計算任務: "+getTaskName()+" 執行完成!");
        return result;
    }
}

 代碼的核心就是創建List<FutureTask<Integer>> 進行線程任務的計算結果的接收。然后再循環使用futureTask.get()方法來進行結果的獲取。要注意的是get方法會阻塞主線程,所以主線程會等待所有線程的計算結果完成之后在進行求和處理。一定要注意的是 FutureTask是Future接口的實現類

幸运飞艇停吗 YISHANGJIUJIESHAOLE DUOXIANCHENGRENWUJISUAN,BAOKUOLEFANGMIANDENEIRONG,XIWANGDUIQITABIANCHENGJIAOCHENGYOUXINGQUDEPENGYOUYOUSUOBANGZHU。

幸运飞艇停吗 BENWENWANGZHILIANJIE:http://snifly.cn/article/detail_4596257.html

相關圖片

相關文章