1

我有一个资源(在我的例子中是 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 不是我提交的,而是已经装饰的东西。

4

0 回答 0