6 回答

TA貢獻(xiàn)1784條經(jīng)驗(yàn) 獲得超8個(gè)贊
使用 execute
或者 submit
執(zhí)行任務(wù)的時(shí)候,傳入的任務(wù)參數(shù)必然是 Runnable
或者 Callable
的實(shí)現(xiàn)類(lèi) —— 那么在 實(shí)現(xiàn)類(lèi) 中添加對(duì)應(yīng)屬性(引用),然后構(gòu)造的時(shí)候?qū)?shù)傳入即可。

TA貢獻(xiàn)1815條經(jīng)驗(yàn) 獲得超10個(gè)贊
用newFixedThreadPool()的時(shí)候當(dāng)前線(xiàn)程和線(xiàn)程池中的線(xiàn)程是父子關(guān)系?求指教

TA貢獻(xiàn)1820條經(jīng)驗(yàn) 獲得超9個(gè)贊
看你怎么傳了 如果用類(lèi) 構(gòu)造方法里把屬性傳進(jìn)去 如果用 lambda 直接傳,但是沒(méi)辦法傳基本類(lèi)型的非final參數(shù)

TA貢獻(xiàn)1829條經(jīng)驗(yàn) 獲得超13個(gè)贊
不知道題主是怎么使用這個(gè)方法的...我一般就直接起異步任務(wù)然后用到指定線(xiàn)程池的,傳參的話(huà),可以直接在CompletableFuture.supplyAsync
里的參數(shù)直接使用就是了,舉個(gè)栗子
public static void main(String[] args) {
// 起10個(gè)線(xiàn)程的線(xiàn)程池
ExecutorService myExecutor = Executors.newFixedThreadPool(10);
// length和param就是所謂的父線(xiàn)程的參數(shù)吧
Long length = 1l;
BigDecimal param = new BigDecimal(0);
// 創(chuàng)建10個(gè)異步任務(wù),采用的線(xiàn)程池就是自己創(chuàng)建的線(xiàn)程池myExecutor,然后調(diào)用doSomeThing里可以直接把父參數(shù)傳入子方法
List<CompletableFuture<Long>> collect = IntStream.rangeClosed(1, 10).mapToObj(i -> CompletableFuture.supplyAsync(() -> doSomeThing(length, param), myExecutor)).collect(Collectors.toList());
List<Long> longs = collect.stream().map(CompletableFuture::join).collect(Collectors.toList());
System.out.println(longs);
}
/**
* 這個(gè)私有方法到時(shí)候就是子線(xiàn)程執(zhí)行的地方
*/
private static Long doSomeThing(Long length, BigDecimal param) {
return length;
}
不知道這種使用方法有沒(méi)有到達(dá)你想要的要求啊

TA貢獻(xiàn)1833條經(jīng)驗(yàn) 獲得超4個(gè)贊
通過(guò) InheritableThreadLocal 傳遞就好了,父線(xiàn)程的對(duì)象,子線(xiàn)程也可以讀到!