我有以下邏輯(簡體):終止應用程序和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()'。但是你是對的,我不應該安排他們。謝謝! –