私はJavaでネットワークサーバーを作成していますが、私はそれには小さな問題があります。コメントで言ったように、私は次の上/フリップ/変数this.Listeningの値を変更し、ループは停止しませんが、終了を否定するならば、今すぐJavaループの終了条件
import java.io.IOException;
import java.net.ServerSocket;
/**
* Another flavor of the server module.
* According to GOD (also known as Joshua Bloch) this is the proper
* implementation of a singleton (Note: serialization).
*
* @author estol
*/
public enum EnumSingletonServer implements ServerInterface, Runnable
{
SERVER;
private ServerSocket serverSocket = null;
private boolean Listening = true;
@Override
public void bind() {
this.bind(DEFAULTPORT);
}
@Override
public void bind(int Port) {
try {
this.serverSocket = new ServerSocket(Port);
} catch (IOException ioe) {
System.err.printf("Cannot bind to port %d\nAdditional information:\n%s\nExiting\n", Port, ioe.getMessage());
System.exit(1);
}
}
/**
* Not that elegant, but does not work with flipping the switch, because
* the loop (in public void run()) is only running when there is an incoming connection(?).
*
*
* FIXME
*/
@Override
public void shutdown() {
// this.Listening = !this.Listening; // FIXME
System.exit(0);
}
/**
* Accepting connections on the port, we are bound to.
* The main loop of the server is a bit broken. Does not exit,
* if we flip the value of this.Listening, but exit on the next incoming
* connection. This is a problem.
*
* FIXME
*/
@Override
public void run() {
try {
System.out.printf("Listening on %d\n", this.serverSocket.getLocalPort());
Thread.currentThread().setName("ServerThread");
// FIXME
do {
new Thread(new ServerWorkerThreads(this.serverSocket.accept(), 3)).start();
} while (this.Listening);
this.serverSocket.close();
System.exit(0);
} catch (IOException ioe) {
System.err.printf("Cannot accept on, or close port %d\nAdditional information:\n%s\nExiting\n", this.serverSocket.getLocalPort(), ioe.getMessage());
System.exit(1);
}
}
}
: コードが話をしましょう接続。
最初は列挙子にサーバーを実装していませんでしたが、シリアライズ後にシングルトンにならなかったクラスで実行しましたが、それは期待通りに実行されました。私はしばらくして(条件)やdo while(条件)ループを試しました。
すべてのサポートをいただければ幸いです。あなたのシャットダウン方法では
あなたは変更をすべてのスレッドから見ることができるように 'volatile 'を聞いてみましたか? – assylias
serversocketブロック内のaccept()メソッド。新しい接続を待っている間にループが実行されていません。新しい接続を受信した後に続行するかどうかのみをチェックします。私はあなたが欲しい振る舞いをどうやって得るかについてはあまりよく分かりません。 – Steven
揮発性で解決しました。ありがとう! –