在我的Java应用程序中,我希望有一个线程池(为此我使用ExecutorService)连接到memcached服务器以发出一些请求。我希望每个线程都有自己的连接,该连接一次打开,并应在整个运行期间保持不变。我打算使用在另一个问题中发现的以下代码:
执行器服务
ExecutorService threadPool =
Executors.newFixedThreadPool(5, Executors.defaultThreadFactory());
池中的线程执行的可运行对象
public class SocketTask implements Runnable {
private String workDetails;
private static final ThreadLocal<Socket> threadLocal =
new ThreadLocal<Socket>(){
@Override
protected Socket initialValue(){
return new Socket();
}
};
public SocketTask(String details){
this.workDetails = details;
}
public void run(){
Socket s = getSocket(); //gets from threadlocal
//send data on socket based on workDetails, etc.
}
public static Socket getSocket(){
return threadLocal.get();
}
}
我的问题是,当我初始化套接字时,该如何做,以便能够将参数(例如具有内存缓存服务器IP的字符串)传递给新的Socket()调用?
最佳答案
使用工厂而不是静态字段的示例。
工厂创建:
final SocketTaskFactory socketTaskFactory = new SocketTaskFactory("...", 12345);
工厂使用(而不是现在的“new SocketTask(...)”):
Runnable socketTask = socketTaskFactory.createSocketTask("the work details");
工厂代码,包括套接字任务作为内部类:
package threadlocal;
import java.io.IOException;
import java.net.Socket;
public class SocketTaskFactory
{
final String host;
final int port;
public SocketTaskFactory(String host, int port)
{
this.host = host;
this.port = port;
}
public Runnable createSocketTask(String workDetails)
{
return new SocketTask(workDetails);
}
final ThreadLocal<Socket> socketForThread = new ThreadLocal<Socket>()
{
@Override
protected Socket initialValue()
{
try
{
return new Socket(host, port);
}
catch(IOException exception)
{
throw new RuntimeException(exception);
}
}
};
private class SocketTask implements Runnable
{
private final String workDetails;
public SocketTask(String workDetails)
{
this.workDetails = workDetails;
}
@Override
public void run()
{
Socket socket = socketForThread.get();
// ...
}
}
}
关于java - 初始化ThreadLocal变量时传递参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39998299/