Java多執行緒並行處理任務的實現
Java多執行緒並行處理任務的實現
在實際專案開發的過程中,遇到過需要處理一個由多個子任務組成的任務的問題.順序處理起來會造成響應時間超長,使用者體驗不好的問題.我想到一個解決方案,即使用多執行緒並行處理子任務.思路就是使用ThreadPoolExecutor執行緒池,然後使用一個list儲存所有執行緒的例項引用.以下是程式碼實現.
以下是程式碼實現
FactorialCalculator 類:用於實現具體的業務處理
package ThreadTask;
import java.util.concurrent.Callable;
public class FactorialCalculator implements Callable<Integer> {
private int number;
public FactorialCalculator(int number) {
this.number = number;
}
//計算階乘
public Integer call() throws Exception {
Integer result = 1;
if (number == 0 || number == 1)
result = 1;
else {
for (int i = 2; i <= number; i++) {
result *= i;
//為了演示效果,休眠20ms
Thread.sleep(20);
}
}
System.out.printf("執行緒:%s," + number + "!= %d\n", Thread.currentThread().getName(), result);
return result;
}
}
Main 類:用於實現多執行緒任務的實現和處理
import ThreadTask.FactorialCalculator;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.ThreadPoolExecutor;
public class Main {
public static void main(String[] args) {
Long startTime = System.currentTimeMillis();
ThreadPoolExecutor executor = (ThreadPoolExecutor) Executors.newFixedThreadPool(2);//建立只有2個執行緒的執行緒池
//存放結果的列表
List<Future<Integer>> resultList = new ArrayList<>();
//通過Random類生成一個隨機數生成器
Random random = new Random();
for (int i = 0; i < 10; i++) {
int number = random.nextInt(10);
FactorialCalculator calculator = new FactorialCalculator(number);
Future<Integer> result = executor.submit(calculator);
resultList.add(result);
}
//建立一個迴圈來監控執行器的狀態
try {
while (executor.getCompletedTaskCount() < resultList.size()) {
System.out.printf("\n已完成的執行緒數量: %d\n", executor.getCompletedTaskCount());
for (int i = 0; i < resultList.size(); i++) {
Future<Integer> result = resultList.get(i);
System.out.printf("第 %d 個執行緒 : 是否完成:%s\n", i, result.isDone());
}
Thread.sleep(50);
}
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("全部執行緒執行結束");
try {
for (int i = 0; i < resultList.size(); i++) {
Future<Integer> result = resultList.get(i);
Integer number = null;
number = result.get();
System.out.printf("第 %d 個執行緒 執行結果是: %d\n", i, number);
}
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ExecutionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
executor.shutdown();
Long endTime = System.currentTimeMillis();
System.out.println("使用時間 = [" + (endTime - startTime) + "]");
}
}
相關文章
- Java 多執行緒處理任務的封裝Java執行緒封裝
- Java多執行緒——獲取多個執行緒任務執行完的時間Java執行緒
- 畫江湖之 PHP 多執行緒開發 【利用多執行緒 序列任務變並行處理 從而減少序列執行時間】PHP執行緒並行
- 使用 Rx 的計算和最大化執行緒處理並行任務執行緒並行
- Python實現投遞多執行緒任務Python執行緒
- 批量任務體現多執行緒的威力!執行緒
- C#多執行緒開發-任務並行庫04C#執行緒並行
- Java多執行緒的實現Java執行緒
- Java中使用ThreadPoolExecutor並行執行獨立的單執行緒任務Javathread並行執行緒
- Spring多執行緒事務處理Spring執行緒
- Java實現終止執行緒池中正在執行的定時任務Java執行緒
- java實現多執行緒的方法Java執行緒
- Java多執行緒的實現方法Java執行緒
- Java多執行緒實現方式Java執行緒
- java多執行緒:執行緒體往外丟擲異常的處理機制實踐Java執行緒
- Python建立多執行緒任務並獲取每個執行緒返回值Python執行緒
- PHP多程式處理並行處理任務例項(轉,備用)PHP並行
- java中多執行緒併發的處理方式Java執行緒
- 多執行緒程式設計,處理多執行緒的併發問題(執行緒池)執行緒程式設計
- .net使用Task多執行緒執行任務 .net限制執行緒數量執行緒
- JAVA多執行緒下載的實現Java執行緒
- Swift多執行緒:使用Thread進行多執行緒間通訊,協調子執行緒任務Swift執行緒thread
- Java多執行緒——執行緒Java執行緒
- Java高併發與多執行緒(二)-----執行緒的實現方式Java執行緒
- 多執行緒-定時任務的多次執行程式碼體現執行緒行程
- Java實現多執行緒的三種方式Java執行緒
- 使用Visual Basic 6實現真正實用的多執行緒處理執行緒
- boost中asio網路庫多執行緒併發處理實現,以及asio在多執行緒模型中執行緒的排程情況和執行緒安全。執行緒模型
- java 基礎之圖片的多執行緒處理和大檔案的多執行緒拷貝Java執行緒
- Java多執行緒事務管理Java執行緒
- Java多執行緒-執行緒中止Java執行緒
- Java多執行緒——執行緒池Java執行緒
- Java多執行緒【三種實現方法】Java執行緒
- Java多執行緒-基礎及實現Java執行緒
- Java多執行緒--併發和並行的區別Java執行緒並行
- 3種方式實現python多執行緒併發處理Python執行緒
- JAVA多執行緒下高併發的處理經驗Java執行緒
- Java多執行緒-執行緒池的使用Java執行緒