ScheduledThreadPoolExecutor инициализирует ресурс при запуске потока и внедряет его в рабочий-управляемый - PullRequest
1 голос
/ 18 марта 2019

У меня есть ресурс (в моем случае сокет 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 - это не то, что я отправил, а что-то уже оформленное.

...