私は次のロジックを持っています(簡略化):
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
のは、適切な方法で終了することです。まず第一に、これswitchStopServer()
はそれを行う正しい方法ですか、それともより良い解決策がありますか?
sを中断しないScheduledExecutorService
ので、私は少し混乱しています。また、 (少なくとも私にとっては中断しません)、中断することはできません。私の例では、の必要はありませんが、実際のアプリケーションでは必要です。shutdownNow()
Thread
ScheduledFuture.cancel(true)
ServerSocket.accept()
ScheduledExecutorService