抱歉,如果这是基本问题,我只是看不到答案。基本上我使用 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/