この質問は、過去にさまざまな形で尋ねられたことは間違いありませんが、特定のシナリオについてはそれほど多くはありません。
UDP経由でネットワークメッセージを受信するのを待っている間にブロックしているスレッドを停止する最も正しい方法は何ですか.
たとえば、次のスレッドがあるとします。
public class ClientDiscoveryEngine extends Thread {
private final int PORT;
public ClientDiscoveryEngine(final int portNumber) {
PORT = portNumber;
}
@Override
public void run() {
try {
socket = new DatagramSocket(RECEIVE_PORT);
while (true) {
final byte[] data = new byte[256];
final DatagramPacket packet = new DatagramPacket(data, data.length);
socket.receive(packet);
}
} catch (SocketException e) {
// do stuff 1
} catch (IOException e) {
// do stuff 2
}
}
}
さて、より正しい方法はinterrupt()
メソッドを使用することでしょうか? たとえば、次のメソッドを追加します。
@Override
public void interrupt() {
super.interrupt();
// flip some state?
}
私の唯一の懸念は、socket.receive()
割り込み不可能なブロッキング方法ではないということですか? 私が考えた1つの方法は、そのメソッド呼び出しで上記のように割り込みメソッドを実装socket.close()
しrun
、SocketException
. while(true)
または、割り込みメソッドで反転する状態を使用する代わりに。これが最善の方法ですか?それとももっとエレガントな方法がありますか?
ありがとう