我有以下逻辑(简体):终止应用程序和ScheduledExecutorService;螺纹
public class Application {
public static volatile boolean stopServer;
private static ScheduledExecutorService taskScheduler;
private static Thread listenerThread;
public static synchronized void switchStopServer() {
stopServer = true;
listenerThread.interrupt();
taskScheduler.shutdownNow();
}
public static void main(String[] args) {
int threadPoolSize = 4;
taskScheduler = Executors.newScheduledThreadPool(threadPoolSize);
listenerThread = new ListenerThread();
taskScheduler.schedule(listenerThread, 0, TimeUnit.NANOSECONDS);
}
}
public class ListenerThread extends Thread {
private static ServerSocket serverSocket;
private Socket socketConnection;
@Override
public void run() {
while (!Application.stopServer) {
try {
socketConnection = serverSocket.accept();
new CommunicatorThread(socketConnection).start();
} catch (SocketException e) {
} catch (Exception e) {
}
}
}
private static void closeServerSocket() {
try {
if (serverSocket != null && !serverSocket.isClosed()) serverSocket.close();
} catch (Exception e) { }
}
@Override
public void interrupt() {
closeServerSocket();
super.interrupt();
}
}
我想实现的,是终止Thread
S上的正确方法。首先,这是(switchStopServer()
)这样做的正确方法,还是有更好的解决方案?
我与ScheduledExecutorService
有点困惑,因为shutdownNow()
不中断Thread
S,同样没有ScheduledFuture.cancel(true)
(至少对我来说它并没有),所以我不能中断ServerSocket.accept()
。我知道,在我的例子中,不需要ScheduledExecutorService
,但是在我的真实应用程序中有。
你为什么要按照预定的方式在ServerSocket上监听?任何具体原因?如果你有一个单独的专用线程在一个紧密的循环中监听一个ServerSocket并处理新的连接到新产生的线程或执行程序服务,设计可能会更简单。 – Zaki
@Zaki我想,因为我以预定的方式启动其他线程,所以我将只使用同一个池来启动所有线程,所以当需要终止时,我只需调用'shutdownNow()'。但是你是对的,我不应该安排他们。谢谢! –