java - 有没有办法让 Java 线程只在初始化时执行某些操作?

标签 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

    }

}

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

关于如何实现这一目标有什么想法吗?

更新:不是100%需要,但我很好奇是否还有一种方法可以让它在终止时执行某些操作(也许这样我可以关闭与服务器的连接而不是等待它超时)。

最佳答案

您可以使用 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 方法将从池中获取一个连接(如果没有可用的连接,它将动态创建它并将其添加到已创建的连接集中),并在使用完毕后将其释放到池中(在finally block 中)。这将使连接可用于任何其他任务。这样做的优点是使所需的连接数可能低于线程池中的线程数。

关于java - 有没有办法让 Java 线程只在初始化时执行某些操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10372827/

相关文章:

java - Android:我的异步方法有效吗?

java - Hibernate 3.5.1 的 Tomcat 错误

java - 将 module-info.java 添加到项目会导致 lombok 错误

java - 同时重新加载具有并发读取器的多个缓存

c++ - 在多线程循环中调用函数

multithreading - 可以在一个GPU上并行运行多个 tensorflow 推论吗?

Java线程存储

java - 使用 java.util.function.Function 实现工厂设计模式

java - 如何在没有请求的 servlet 的情况下在 jsf 托管 bean 中获取请求 url?

java - 来自 socket.getInputStream() 的 ObjectInputStream