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运算的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java简易日历程序报告_简单的日历小程
- 下一篇: java 只有日期的类_JAVA日期和时