日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java多核的利用率_java利用FutureTask、ExecutorService 在多核时代充分利用CPU运算

發布時間:2023/12/4 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java多核的利用率_java利用FutureTask、ExecutorService 在多核时代充分利用CPU运算 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

java利用FutureTask、ExecutorService 在多核時代充分利用CPU運算

FutureTask、ExecutorService 相關知識,請看java,API

一個使用FutureTask簡單的例子:

package com.spell.threads;

import java.util.concurrent.Callable;

import java.util.concurrent.ExecutionException;

import java.util.concurrent.FutureTask;

/**

* 測試FutureTask的用法,如果不想分支線程阻塞主線程,又想取得分支線程的執行結果,就用FutureTask

*

*

@author Administrator

*

*/

public class FutureTaskTest {

/**

* @param args

*/

public static void main(String[] args) {

CountNum cn = new CountNum(0);

//FutureTask 這里的表示返回的是Integer

FutureTask ft = new FutureTask(cn);

Thread td = new Thread(ft);

System.out.println("futureTask開始執行計算:" + System.currentTimeMillis());

td.start();

System.out.println("main 主線程可以做些其他事情:" + System.currentTimeMillis());

try {

// futureTask的get方法會阻塞,知道可以取得結果為止

Integer result = ft.get();

System.out.println("計算的結果是:" + result);

} catch (InterruptedException e) {

e.printStackTrace();

} catch (ExecutionException e) {

e.printStackTrace();

}

System.out.println("取得分支線程執行的結果后,主線程可以繼續處理其他事項");

}

}

class CountNum implements Callable {

private Integer sum;

public CountNum(Integer sum) {

this.sum = sum;

}

public Object call() throws Exception {

for (int i = 0; i < 100; i++) {

sum = sum + i;

}

// 休眠5秒鐘,觀察主線程行為,預期的結果是主線程會繼續執行,到要取得FutureTask的結果是等待直至完成。

Thread.sleep(3000);

System.out.println("futureTask 執行完成" + System.currentTimeMillis());

return sum;

}

}運行的結果是:

futureTask開始執行計算:1280114852250

main 主線程可以做些其他事情:1280114852250

futureTask 執行完成1280114855250

計算的結果是:4950

取得分支線程執行的結果后,主線程可以繼續處理其他事項

如果有多個FutureTask要執行批量運算,從而充分的利用多核CPU,可以參考下面的代碼:

package com.spell.threads;

import java.util.ArrayList;

import java.util.List;

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;

/**

* 測試多核時代,充分的利用CPU來運算數據,并且處理返回的結果,學習API專用

*

*

@author Administrator

*

*/

public class FutureTaskAndExecutor {

/**

* @param args

*/

public static void main(String[] args) {

List> list = new ArrayList>();

// 創建線程池,線程池的大小和List.size沒有啥必然的關系,一般的原則是<=list.size,多出來浪費不好

ExecutorService exec = Executors.newFixedThreadPool(5);

for (int i = 10; i < 20; i++) {

// 創建對象

FutureTask ft = new FutureTask(new GetSum(i));

// 添加到list,方便后面取得結果

list.add(ft);

// 一個個提交給線程池,當然也可以一次性的提交給線程池,exec.invokeAll(list);

exec.submit(ft);

}

// 開始統計結果

Integer total = 0;

for (FutureTask tempFt : list) {

try {

total = total + tempFt.get();

} catch (InterruptedException e) {

e.printStackTrace();

} catch (ExecutionException e) {

e.printStackTrace();

}

}

// 處理完畢,一定要記住關閉線程池,這個不能在統計之前關閉,因為如果線程多的話,執行中的可能被打斷

exec.shutdown();

System.out.println("多線程計算后的總結果是:" + total);

}

}

/**

* 這個類很簡單,就是統計下簡單的加法(從1 到total)

*

*

@author Administrator

*

*/

class GetSum implements Callable {

private Integer total;

private Integer sum = 0;

public GetSum(Integer total) {

this.total = total;

}

public Object call() throws Exception {

for (int i = 1; i < total + 1; i++) {

sum = sum + i;

}

System.out.println(Thread.currentThread().getName() + " sum:" + sum);

return sum;

}

}運行的結果是:

pool-1-thread-1 sum:120

pool-1-thread-1 sum:136

pool-1-thread-1 sum:153

pool-1-thread-1 sum:171

pool-1-thread-1 sum:190

pool-1-thread-2 sum:66

pool-1-thread-3 sum:78

pool-1-thread-4 sum:91

pool-1-thread-5 sum:105

多線程計算后的總結果是:1165

總結

以上是生活随笔為你收集整理的java多核的利用率_java利用FutureTask、ExecutorService 在多核时代充分利用CPU运算的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。