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参数,它工作得非常好,现在我的整个过程快多了!