Java 如何使ExecutorService中的线程与可运行线程通信?

Java 如何使ExecutorService中的线程与可运行线程通信?,java,concurrency,executorservice,Java,Concurrency,Executorservice,我目前正在使用ExecutorService解析文件: ExecutorService service = Executors.newFixedThreadPool(10); 后来: service.submit(new FileParser(file)); 但是,用于解析文件的工具需要进行初始化,这需要相当长的时间。我希望每个线程只执行一次初始化(不是一次,因为初始化参数不是线程安全的),然后只在提交的runnable中执行解析 我看到ThreadFactory可以用来向执行器提供我自己的

我目前正在使用
ExecutorService
解析文件:

ExecutorService service = Executors.newFixedThreadPool(10);
后来:

service.submit(new FileParser(file));
但是,用于解析文件的工具需要进行初始化,这需要相当长的时间。我希望每个线程只执行一次初始化(不是一次,因为初始化参数不是线程安全的),然后只在提交的runnable中执行解析

我看到
ThreadFactory
可以用来向执行器提供我自己的线程,因此我可以通过以下方式初始化我的参数:

public class MyThreadFactory implements ThreadFactory {
    public Thread newThread(Runnable r) {
        return new MyThread(); // Initialization part inside the constructor
    }
}
然而,我不知道如何提供新的文件来解析线程。。。 有什么想法吗


谢谢

您可以使用变量进行此初始化。在每次执行过程中,您可以检查是否对当前线程执行了初始化,然后使用它存储您需要的任何内容。

必要的初始化是否取决于要解析的文件?然后,您似乎必须在创建文件解析器时执行此操作。ExecutorService将调用ThreadFactory.newThread。事实上,该参数将不是您的可运行参数(即FileParser),但它将是一个包装工作程序。这太完美了,谢谢!我初始化了线程“运行”中的所有内容,并使用ThreadLocal让所有新的可运行程序都知道init参数,它工作得非常好,现在我的整个过程快多了!