【发布时间】:2012-05-30 19:14:18
【问题描述】:
我有以下逻辑(简化):
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();
}
}
我想要实现的是以正确的方式终止Threads。首先,这是 (switchStopServer()) 的正确方法吗,还是有更好的解决方案?
我对@987654321@ 有点困惑,因为shutdownNow() 不会打断Threads,ScheduledFuture.cancel(true) 也不会(至少对我来说不会),所以我不能打断ServerSocket.accept()。我知道,在我的示例中不需要ScheduledExecutorService,但在我的实际应用程序中是有的。
【问题讨论】:
-
你为什么要以预定的方式监听 ServerSocket?有什么具体原因吗?如果您有一个专用线程在紧密循环中侦听 ServerSocket 并处理与新衍生线程或执行器服务的新连接,则设计可能会简单得多。
-
@Zaki 我想,因为我以预定的方式启动其他线程,所以我将使用同一个池来启动所有线程,所以当需要终止时,我只需调用
shutdownNow().但你是对的,我根本不应该安排它们。谢谢!
标签: java multithreading scheduled-tasks