私は Java を初めて使用し、現在取り組んでいるアプリケーションに手を加えています。これが私がやろうとしていることです。
QuickServer をサーバーとして使用するクライアント/サーバーのセットアップがあります。私はそれをうまく実行しました。「\ r」\ n」を使用してコマンドを1行ずつ送受信するため、クライアントは
public class CommandHandler extends Thread {
public void run() {
while (connected) {
//read and write
if (command.equals("USERNAME")) {
AsynchEventBusSingleton.$().postEvent(new TellParentToGiveUN())
}
...
}
}
Thread を拡張しないと GUI がフリーズするため、CommandHandler には独自のスレッドが必要であると推測します。ただし、問題は AsyncEventBusSingleton です。
public class AsyncEventBusSingleton {
private EventBus ebEventBus = null;
final static AsyncEventBusSingleton aebInstance = new AsyncEventBusSingleton();
public synchronized static AsyncEventBusSingleton $() {
return aebInstance;
}
private AsyncEventBusSingleton() {
ebEventBus = new AsyncEventBus(Executors.newCachedThreadPool());
}
public void registerSubscriber(Object subscriber) {
ebEventBus.register(subscriber);
}
public void unRegisterSubscriber(Object subscriber) {
ebEventBus.unregister(subscriber);
}
public synchronized void postEvent(Object e) {
ebEventBus.post(e);
}
}
CommandHandler スレッド内でこのクラスを呼び出すと、メイン スレッドの他のクラスはイベントを受け取りません。「同期」キーワードを削除すると、一部のイベントが受信/繰り返し/エラーが生成されます。
CommandHandler からイベントをスローせずに、CommandHandler をインスタンス化するクラスの参照を渡し、CommandHandler のメソッドを呼び出すようにすると、すべてが正常に機能するように見えます。
public class ServerConnectionHandler {
private CommandHandler commandhandler;
public void ConnectToServer() {
commandhandler = new CommandHandler(this);
}
public void dispatchServerEvent() {
commandhandler.sendResponse("MyUN");
}
}
public class CommandHandler extends Thread {
private PrintWriter printWriter;
private ServerConnectionHandler serverconnectionhandler;
public sendResponse(String s) {
this.printWriter.println(s);
}
public void run() {
while (connected) {
//read and write
if (command.equals("USERNAME")) {
this.serverconnectionhandler.dispatchServerEvent();
}
...
}
}
クライアントに特定のコマンドをリッスンさせ、イベントをディスパッチして応答させるためのベスト プラクティスは何ですか?