在實(shí)際業(yè)務(wù)開發(fā)過程中仇祭,我們需要使用多線程垦藏,高并發(fā)執(zhí)行某個(gè)業(yè)務(wù)邏輯方法梆暖,方法的請(qǐng)求參數(shù)是實(shí)體類,返回參數(shù)也是實(shí)體類掂骏,本文將介紹如何實(shí)現(xiàn)此功能式廷。
詳情參見下面代碼,由于為了方便演示芭挽,兩個(gè)實(shí)體類和業(yè)務(wù)方法都放在了main方法所在的類,所以加了static修飾符蝗肪。
public class TestThread {
public static void main(String[] args) {
List<Input> inputList = new ArrayList<>();
//首先我們構(gòu)造一個(gè)請(qǐng)求參數(shù)的集合
for (int i = 0; i < 50; i++) {
Input input = new Input();
input.setNameInput("集合信息" + i);
inputList.add(input);
}
// 創(chuàng)建一個(gè)線程大小與集合數(shù)量相等的線程池
ExecutorService pool = Executors.newFixedThreadPool(inputList.size());
// 創(chuàng)建Future的list集合袜爪,用以接收返回值
List<Future> list = new ArrayList();
for (int i = 0; i < inputList.size(); i++) {
//請(qǐng)求實(shí)體類
Input input = inputList.get(i);
// 執(zhí)行任務(wù)并獲取Future對(duì)象,這里采用lambda表達(dá)式替代Callable接口的實(shí)現(xiàn)
// getName(input)就是你要執(zhí)行業(yè)務(wù)邏輯的方法薛闪,返回值需要用f.get()獲取
Future f = pool.submit(() -> getName(input));
list.add(f);
}
// 關(guān)閉線程池
pool.shutdown();
// 循環(huán)獲取所有并發(fā)線程的任務(wù)結(jié)果
for (Future f : list) {
try {
// 從Future對(duì)象上獲取任務(wù)的返回值辛馆,返回一個(gè)實(shí)體類,需要進(jìn)行強(qiáng)制轉(zhuǎn)換
//f.get()會(huì)一直阻塞主進(jìn)程,直到業(yè)務(wù)邏輯方法執(zhí)行結(jié)束
Output output = (Output) f.get();
//我們輸出一下看看結(jié)果
System.out.println("output結(jié)果:"+output.getNameOutput());
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
}
/**
* 請(qǐng)求實(shí)體類
*/
public static class Input {
private String nameInput;
public String getNameInput() {
return nameInput;
}
public void setNameInput(String nameInput) {
this.nameInput = nameInput;
}
}
/**
* 返回實(shí)體類
*/
public static class Output {
private String nameOutput;
public String getNameOutput() {
return nameOutput;
}
public void setNameOutput(String nameOutput) {
this.nameOutput = nameOutput;
}
}
/**
* 你的業(yè)務(wù)邏輯方法
* @param input 請(qǐng)求實(shí)體類參數(shù)
* @return 返回實(shí)體類參數(shù)
*/
public static Output getName(Input input) {
//為了證明我們的確開啟了多線程,所以此處加了沉睡1秒鐘的操作昙篙,50次循環(huán)在5秒鐘內(nèi)執(zhí)行完畢腊状,證明的確開啟了多線程
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Output output = new Output();
//方法執(zhí)行邏輯,我們這里只是將請(qǐng)求參數(shù)的nameInput賦值給返回參數(shù)的nameOutput
output.setNameOutput(input.getNameInput());
//返回
return output;
}
}