我有一个资源(在我的例子中是 zmq 套接字,但这个细节可以忽略)。该资源不是线程安全的,只能从打开连接的线程中使用。
我想在 ScheduledThreadPoolExecutor 中使用它。所以我理想的工作流程是:
- 启动时线程打开连接
- 每个工作任务都应该实现和接口(socketAware)
当前线程的套接字通过接口的方法注入到工作人员。
ScheduledExecutorService service = Executors.newScheduledThreadPool(5, new SocketAwareThreadFactory(socket)); service.scheduleAtFixedRate(new SocketAwareRunable(), 0, 5, TimeUnit.SECONDS); public class SocketAwareThreadFactory implements ThreadFactory { private final Proxyable socket; SocketAwareThreadFactory(Proxyable socket) { this.socket = socket; } @Override public Thread newThread(@Nonnull Runnable action) { return new SocketAwareThread(socket, action); } } public class SocketAwareThread extends Thread { private final Socket proxy; public SocketAwareThread(Proxyable socket, Runnable action) { super(action); proxy = socket.proxy(); } @Override public void run() { proxy.open();//connection opens here super.run(); } }
除了使用反射之外,现在有什么方法可以将打开的套接字传播回该线程执行的每个 Runable ?
看起来 ThreadPoolExecutor.beforeExecute 可以做到这一点,但它不适用于 ScheduledThreadPoolExecutor,因为 runnable 不是我提交的,而是已经装饰的东西。