一)背景
該案例主要是結合多線程、ThreadPoolExecutor線程池實現的一個有返回值的多線程功能。
二)第一個線程類
創建一個ListThread線程類,繼承java.util.concurrent.Callable接口,並指定方法具體的返回值類型。
實現源碼:
package com.oysept.thread;
import java.util.List;
import java.util.concurrent.Callable;
/**
* ListThread線程類, 繼承Callable接口
* @author ouyangjun
*/
public class ListThread implements Callable<String> {
private List<Object> list;
/** 初始化list, 傳值可各種各 樣*/
public ListThread(List<Object> list) {
this.list = list;
}
/** 返回字符串,也可以把對象轉化成json字符串返回 */
public String call() throws Exception {
// 做具體的業務邏輯
for (Object obj : list) {
System.out.println("ListThread==>list: " + obj);
}
return "ListThread OK!";
}
}
三)第二個線程類
創建一個MapThread線程類,繼承java.util.concurrent.Callable接口,並指定方法具體的返回值類型。
實現源碼:
package com.oysept.thread;
import java.util.Map;
import java.util.concurrent.Callable;
/**
* MapThread線程類, 繼承Callable接口
* @author ouyangjun
*/
public class MapThread implements Callable<String> {
private Map<String, Object> map;
/** 初始化map, 傳值可各種各樣 */
public MapThread(Map<String, Object> map) {
this.map = map;
}
/** 返回字符串, 也可以把對象轉化成json字符串返回 */
public String call() throws Exception {
// 做具體的業務邏輯
for (String key : map.keySet()) {
System.out.println("MapThread==>map.key: " + key + ", map.value: "+ map.get(key));
}
return "MapThread OK!";
}
}
四)線程方法測試類
package com.oysept.thread;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.ThreadPoolExecutor;
/**
* 多線程測試類
* @author ouyangjun
*/
public class ThreadPool {
/**
* 默認的線程池,指定線程池默認大小,也可以指定具體的線程池,如上面的註釋代碼
* Executors.newCachedThreadPool(); //創建一個緩衝池,緩衝池容量大小爲Integer.MAX_VALUE
* Executors.newSingleThreadExecutor(); //創建容量爲1的緩衝池
* Executors.newFixedThreadPool(int); //創建固定容量大小的緩衝池
*/
private ThreadPoolExecutor poolExecutor = (ThreadPoolExecutor) Executors.newFixedThreadPool(5);
public static void main(String args[]) {
// 執行測試方法
new ThreadPool().exec();
}
public void exec() {
List<Object> list = new ArrayList<Object>();
list.add("oysept111111");
list.add(222222);
list.add(333333);
list.add(444444);
ListThread listThread = new ListThread(list);
Map<String, Object> map = new HashMap<String, Object>();
map.put("555555", "oysept111111");
map.put("666666", 222222);
map.put("777777", 333333);
map.put("888888", 444444);
MapThread mapThread = new MapThread(map);
// 執行
Future<String> resQingStor = poolExecutor.submit(listThread); // 提交多線程任務
Future<String> resRemedy = poolExecutor.submit(mapThread); // 提交多線程任務
try {
String listStr = resQingStor.get(); // 獲取線程方法的返回值
String mapStr = resRemedy.get(); // 獲取線程方法的返回值
System.out.println("==>ThreadPoolExecutor處理成功!,listStr="+listStr+",mapStr="+mapStr);
} catch (InterruptedException e) {
System.out.println("InterruptedException異常: "+e);
} catch (ExecutionException e) {
System.out.println("ExecutionException異常: "+e);
}
}
}
打印效果圖:
識別二維碼關注個人微信公衆號
本章完結,待續,歡迎轉載!
本文說明:該文章屬於原創,如需轉載,請標明文章轉載來源!