有没有办法让Java线程只在初始化时做某事?

Los*_*oul 0 java multithreading

对不起,如果这是基本的,我只是没有看到答案.基本上我使用ThreadPoolExecutor运行几个线程来启动10个线程.我希望每个线程在其生命周期内与服务器建立自己的连接.是否有可能,如果可以,我在哪里放这个代码?

示例代码:

class DoWork implements Runnable{

    protected String[] data = null; 

    public DoWork(String[] data) {
        // get the data each thread needs to work
        this.data = data;
    }

    public void run() {
        // Do the work here

    }

}
Run Code Online (Sandbox Code Playgroud)

我的理解是,如果工作队列中有项目,那么ThreadPoolExecutor使10个线程保持活动状态,并且当工作完成时,它们就会死亡.在这个结构的某处我可以添加连接信息吗?我不想在DoWork方法中这样做,因为这将为每个工作单元完成(因此在工作队列中打开多个项目的连接,可能是数千个并且在我尝试时导致超时).放入类声明和方法之间似乎没有做任何事情(虽然我可能做错了).

有关如何实现这一目标的任何想法?

更新:不是100%需要,但我很好奇是否还有一种方法可以让它在终止时做一些事情(也许所以我可以关闭与服务器的连接,而不是等待它超时).

JB *_*zet 5

您可以使用ThreadLocal存储每个线程的连接:

public class ConnectionProvider {
    private static final ThreadLocal<Connection> threadLocalConnection = 
         new ThreadLocal<Connection>() {
             @Override 
             protected Connection initialValue() {
                 // TODO create and return the connection
             }
         };

    public static Connection getConnection() {
        return threadLocalConnection.get();
    }
}
Run Code Online (Sandbox Code Playgroud)

或者,如果可以通过多个线程(在不同时间)使用连接,则可以创建连接池.run方法将从池中获取连接(将动态创建它并将其添加到已创建的连接集中,无可用),并在完成使用后将其释放到池中(在finally块中).这将使连接可用于任何其他任务.这将具有使所需连接的数量可能低于线程池中的线程数的优点.