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