ソケット接続用に2つのスレッドSocketInとSocketOutを作成しました(どちらもwhile(true)ステートメントで動作しています)。キーボードの入力を待っています。ヌル値を読み込んでいても、スレッドを閉じたり、while(true)を出さないと、次の命令を実行し続けても、それをやり続ける必要があります。いくつかのアドバイス。CSPプログラミングとBlockingQueue
S内にスレッドが他のスレッドから入力操作を読み飛ばすようにする
3
A
答えて
1
を見てください。あなたは、「コマンド」を受け入れ、あなたのループでのキューを使用することができます。コマンドの一つは、ソケットから入力され、他のコマンドは、キーボードから入力される。
private final BlockingQueue<Command> inputChannel = new SynchronousQueue<>();
public void run() {
while (true) {
Command request = this.inputChannel.take();
if (request instanceof Command.KeyboardInput) {
...
} else {
...
}
}
}
0
キーボードを読むためにもう1つのスレッドを導入することができます。次に、キーボードリーダーからソケットライター(たとえばBlockingQueue)への中断の豊富な機能を備えた「チャンネル」をいくつか追加してください:
class SocketApp {
public static void main(String[] args) throws IOException {
ExecutorService pool = Executors.newCachedThreadPool();
URL url = new URL("http://...");
HttpURLConnection con = (HttpURLConnection) url.openConnection();
con.setRequestMethod("POST");
con.setDoOutput(true);
OutputStream dst = con.getOutputStream();
InputStream src = con.getInputStream();
// channel between keyboard reader and socket writer
BlockingQueue<Integer> consoleToSocket = new ArrayBlockingQueue<>(256);
// keyboard reader
pool.submit(() -> {
while (true) {
consoleToSocket.put(System.in.read());
}
});
// socket writer
pool.submit(() -> {
while (true) {
dst.write(consoleToSocket.take());
}
});
// socket reader
pool.submit(() -> {
while (true) {
System.out.println(src.read());
}
});
}
}
// Now you can use different features of BlockingQueue.
// 1. 'poll' with timeout
// socket sender
pool.submit(() -> {
while (true) {
Integer take = consoleToSocket.poll(3, TimeUnit.SECONDS);
if (take != null) {
dst.write(take);
} else {
// no data from keyboard in 3 seconds
}
}
});
// 2. Thread interruption
// socket sender
pool.submit(() -> {
while (true) {
try {
Integer take = consoleToSocket.take();
dst.write(take);
} catch (InterruptedException e) {
// somebody interrupt me wait for keyboard
}
}
});
関連する問題
- 1. 他のスレッドから、std :: cinがこれ以上入力を読み込まないようにする方法はありますか?
- 2. スレッド・サブプロセスから別のスレッド・サブプロセスへの入力を送信
- 3. 複数のスレッドによる読み取り操作中にロックが必要ですか?
- 4. スレッドをさらに作成するスレッド
- 5. 他のスレッドからBindingSourceにアクセスする
- 6. 他のスレッドからスレッドを停止する方法
- 7. C#2つの異なるスレッドからシングルトンを操作する
- 8. スレッド入力キュー
- 9. スレッドを使ってPySideに読み込みを作成する
- 10. どのように - Javaのスレッド他のスレッドへのアクセス(SWING)
- 11. Poco:別のスレッドからブロッキングソケット操作を中止する方法
- 12. 別のスレッド内からUI要素を操作する
- 13. 最初のスレッドのみを入力すると、次のスレッドを入力できません。
- 14. アトミック操作のみを使用するC++/CLIのスレッド同期
- 15. Perlどのように他のスレッドを継続しながらperlで '不正な'スレッドを削除する
- 16. HashMapから削除するスレッドと挿入するスレッドをどうやって作るのですか?
- 17. Android:サービス操作でハンドラとスレッドを挿入する
- 18. 他のスレッドのレジスタまたはスレッドローカル変数を読み取る
- 19. 他のスレッドからTcpClientをリッスンするスレッドを停止するC#
- 20. あるスレッドから他のスレッドへの値の取得
- 21. 1つのスレッドだけがリソースから読み取ることを許可するロックを作成するにはどうすればよいですか?
- 22. UIスレッドが他のスレッドから呼び出されたイベントをリッスンするときのスレッドの安全性
- 23. 行を読み飛ばして他の行をスキップ
- 24. JSONからデータテーブルを読み飛ばすときのエラー
- 25. あるスレッドから他のスレッドで実行するメソッドを呼び出す
- 26. "クロススレッド操作が無効です:作成されたスレッド以外のスレッドからアクセスされたコントロール。
- 27. ToolStripMenuItem:クロススレッド操作が無効です。作成されたスレッド以外のスレッドからアクセスされたコントロール
- 28. クロススレッド操作が無効です:作成されたスレッド以外のスレッドからアクセスされたコントロール
- 29. 異なるスレッドのQFileからの読み込み
- 30. 他のスレッドからhttpリクエストを行っているスレッドをキャンセルする方法
コードを表示してください。私は[割り込み](https://docs.oracle.com/javase/tutorial/essential/concurrency/interrupt.html)を使用すると役立つかもしれないと思います。しかし、これは、どのような方法がブロックされていても中断可能であることを要求します。 – Fildor
あなたは値を提供するのはどうですか?プログラム的には、何かランダムなショーを与えるように、それは続けることができます。しかし、あるコードは役に立ちます。 – GOXR3PLUS