私のコードでは無限のスレッドが実行されています。このスレッドは、UDP読み取りメソッドを作成し、無限に接続をリッスンします。エンドレススレッドが手作業で停止したときにメソッドを呼び出す方法
私がしたいのは、スレッド実行を手動で停止した後にコードの一部を実行することです(Eclipseの中止ボタンをクリックして)。
これを実現する方法はありますか?
私はonDestroy()メソッドに遭遇しましたが、悲しいことにAndroid Javaのみに適用されます!
私のコードでは無限のスレッドが実行されています。このスレッドは、UDP読み取りメソッドを作成し、無限に接続をリッスンします。エンドレススレッドが手作業で停止したときにメソッドを呼び出す方法
私がしたいのは、スレッド実行を手動で停止した後にコードの一部を実行することです(Eclipseの中止ボタンをクリックして)。
これを実現する方法はありますか?
私はonDestroy()メソッドに遭遇しましたが、悲しいことにAndroid Javaのみに適用されます!
まず、ネットワーク読み取りスレッドを停止する正しい方法は、ソケットを閉じることです。そして、読み出し/メソッドが例外をスロー受け取り、あなたはIDEでSTOP]ボタンをクリックすると、それは
private final DatagramSocket udpSocket;
private volatile boolean closed; // or AtomicBoolean
...
public synchronized void start() throws IOException {
if (closed) {
throw new IOException("Closed");
}
new Thread(new Runnable() {
@Override
public void run() {
final byte[] buffer = new byte[1024];
final DatagramPacket dp = new DatagramPacket(buffer, buffer.length);
Throwable error = null;
try {
while(true) {
udpSocket.receive(dp);
final String message = new String(buffer, 0, dp.getLength());
System.out.println(message);
}
} catch (Throwable t) {
if (!closed) {
error = t;
}
}
if (error != null) {
// do some work for error
}
}
}).start();
}
public void close() throws IOException {
synchronized(this) {
if (closed) return;
closed = true;
}
udpSocket.close();
}
、通常、あなたが/(異常)終了直後に、あなたのJVMプロセスを殺すキャッチ。
public static void main(String[] args) {
Runtime.getRuntime().addShutdownHook(
new Thread(
new Runnable() {
@Override
public void run() {
System.out.println("Shutdown");
}
}));
}
またはEclipseでそれを実行しますが、Windows上でtaskkillで停止/からLinux上で殺す:私はコンソールで、あなたのプロセスを実行し、プロセスを停止するには、Ctrl + Cを使用してShutdownHookを追加することをお勧めしたいですJVMプロセスを正常に終了するためのコマンドラインインタフェース。
が で詳細を参照してください日食で停止ボタンをクリックするhttp://www.oracle.com/technetwork/java/javase/signals-139944.html https://docs.oracle.com/javase/7/docs/api/java/lang/Runtime.html#addShutdownHook%28java.lang.Thread%29
乾杯、その種類の私の要件を満たす;) – Ashish
号は、あなたのアプリケーションを実行するJVM全体をシャットダウンします。私が知る限り、その停止ボタンにいくつかのタスクを付加する方法はありません。 – f1sh