为了账号安全,请及时绑定邮箱和手机立即绑定

Java: 用newFixedThreadPool的时候,父线程如何给子线程传参啊?

Java: 用newFixedThreadPool的时候,父线程如何给子线程传参啊?

不负相思意 2019-03-01 01:25:20
Java: 用newFixedThreadPool的时候,父线程如何给子线程传参啊?
查看完整描述

6 回答

?
慕码人8056858

TA贡献1803条经验 获得超6个赞

子线程自定义构造函数,构造函数传参即可

查看完整回答
反对 回复 2019-03-01
?
青春有我

TA贡献1784条经验 获得超8个赞

使用 execute 或者 submit 执行任务的时候,传入的任务参数必然是 Runnable 或者 Callable 的实现类 —— 那么在 实现类 中添加对应属性(引用),然后构造的时候将参数传入即可。

查看完整回答
反对 回复 2019-03-01
?
动漫人物

TA贡献1815条经验 获得超10个赞

用newFixedThreadPool()的时候当前线程和线程池中的线程是父子关系?求指教

查看完整回答
反对 回复 2019-03-01
?
慕妹3146593

TA贡献1820条经验 获得超9个赞

看你怎么传了 如果用类 构造方法里把属性传进去 如果用 lambda 直接传,但是没办法传基本类型的非final参数

查看完整回答
反对 回复 2019-03-01
?
烙印99

TA贡献1829条经验 获得超13个赞

不知道题主是怎么使用这个方法的...我一般就直接起异步任务然后用到指定线程池的,传参的话,可以直接在CompletableFuture.supplyAsync里的参数直接使用就是了,举个栗子

public static void main(String[] args) {
        // 起10个线程的线程池
        ExecutorService myExecutor = Executors.newFixedThreadPool(10);
        
        // length和param就是所谓的父线程的参数吧
        Long length = 1l;
        BigDecimal param = new BigDecimal(0);
        
        // 创建10个异步任务,采用的线程池就是自己创建的线程池myExecutor,然后调用doSomeThing里可以直接把父参数传入子方法
        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);
    }
    
    /**
     * 这个私有方法到时候就是子线程执行的地方
     */
    private static Long doSomeThing(Long length, BigDecimal param) {
        return length;
    }

不知道这种使用方法有没有到达你想要的要求啊

查看完整回答
反对 回复 2019-03-01
?
潇潇雨雨

TA贡献1833条经验 获得超4个赞

通过 InheritableThreadLocal 传递就好了,父线程的对象,子线程也可以读到!

查看完整回答
反对 回复 2019-03-01
  • 6 回答
  • 0 关注
  • 1489 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信