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

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

阅读 11.1k
7 个回答

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

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

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

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

不知道题主是怎么使用这个方法的...我一般就直接起异步任务然后用到指定线程池的,传参的话,可以直接在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;
    }

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

新手上路,请多包涵

楼猪想这样用吗?
图片描述

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

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题