java - 初始化ThreadLocal变量时传递参数

标签 java multithreading sockets

在我的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/

相关文章:

java - 链表。头尾引用

java - 即使文件位于工作目录中,也无法读取 java 中的文件

worker 中的 Python uwsgi 线程

actionscript 中的多线程或绿色线程?

java - 为什么 Java 没有有效地利用我所有的 CPU 内核

sockets - 本书 “Unix Networking Programming”中的拒绝服务攻击问题

java - 微调器禁用滑动打开

java - AEM 6.1 : Get all 'parsys' and 'iparsys' components of the page

sockets - 通过网络传输文件: Send from client or from server?

sockets - 无限循环监听套接字