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) + "]");
}
}
相關文章
- 畫江湖之 PHP 多執行緒開發 【利用多執行緒 序列任務變並行處理 從而減少序列執行時間】PHP執行緒並行
- Python實現投遞多執行緒任務Python執行緒
- Spring多執行緒事務處理Spring執行緒
- Java多執行緒的實現Java執行緒
- 批量任務體現多執行緒的威力!執行緒
- C#多執行緒開發-任務並行庫04C#執行緒並行
- Java實現終止執行緒池中正在執行的定時任務Java執行緒
- Python建立多執行緒任務並獲取每個執行緒返回值Python執行緒
- Java多執行緒實現方式Java執行緒
- Swift多執行緒:使用Thread進行多執行緒間通訊,協調子執行緒任務Swift執行緒thread
- .net使用Task多執行緒執行任務 .net限制執行緒數量執行緒
- 3種方式實現python多執行緒併發處理Python執行緒
- Java高併發與多執行緒(二)-----執行緒的實現方式Java執行緒
- Java實現多執行緒的三種方式Java執行緒
- 前端多執行緒處理——async/await前端執行緒AI
- JAVA多執行緒下高併發的處理經驗Java執行緒
- Java多執行緒-執行緒中止Java執行緒
- Java多執行緒【三種實現方法】Java執行緒
- 【Java多執行緒】執行緒安全的集合Java執行緒
- Java多執行緒-執行緒池的使用Java執行緒
- Java多執行緒之守護執行緒實戰Java執行緒
- Java多執行緒事務管理Java執行緒
- 多工處理方式之二:多執行緒執行緒
- Java之實現多執行緒的方式三:實現Callable介面(結合執行緒池使用)Java執行緒
- 26、多執行緒與並行執行緒並行
- Java多執行緒之synchronized理論Java執行緒synchronized
- 死磕 java執行緒系列之執行緒池深入解析——普通任務執行流程Java執行緒
- Java建立多執行緒的幾種方式實現Java執行緒
- Spring Boot使用執行緒池處理事務任務Spring Boot執行緒
- Java多執行緒之執行緒中止Java執行緒
- Java多執行緒-執行緒狀態Java執行緒
- Java多執行緒-執行緒通訊Java執行緒
- java 多執行緒守護執行緒Java執行緒
- Java多執行緒(2)執行緒鎖Java執行緒
- java多執行緒9:執行緒池Java執行緒
- 【java多執行緒】(二)執行緒停止Java執行緒
- 如何實現多執行緒執行緒
- 【Java多執行緒】輕鬆搞定Java多執行緒(二)Java執行緒