手动停止无限线程后如何调用方法
how to call a method once an endless thread is stopped manually
我的代码中有一个无穷无尽的线程 运行。此线程创建 UDP 读取方法并无休止地侦听连接。
我想做的是在手动停止线程执行后执行一段代码(通过单击 eclipse 中的停止按钮)。
他们是实现这一目标的可能方法吗?
在搜索相同的内容时,我遇到了一个 onDestroy() 方法,但遗憾的是,它仅适用于 Android Java !!!
首先,停止网络读取线程的正确方法是关闭套接字。然后 read/receive 方法抛出一个异常,你捕获它
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();
}
当您在 IDE 中单击“停止”按钮时,通常会立即终止(异常)/终止您的 JVM 进程。我建议 运行 您在控制台中的进程并使用 Ctrl+C 停止进程并添加 ShutdownHook:
public static void main(String[] args) {
Runtime.getRuntime().addShutdownHook(
new Thread(
new Runnable() {
@Override
public void run() {
System.out.println("Shutdown");
}
}));
}
或 运行 它在 Eclipse 中,但在 Windows/kill on Linux 从命令行界面使用 taskkill 停止以正常关闭 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
我的代码中有一个无穷无尽的线程 运行。此线程创建 UDP 读取方法并无休止地侦听连接。
我想做的是在手动停止线程执行后执行一段代码(通过单击 eclipse 中的停止按钮)。
他们是实现这一目标的可能方法吗?
在搜索相同的内容时,我遇到了一个 onDestroy() 方法,但遗憾的是,它仅适用于 Android Java !!!
首先,停止网络读取线程的正确方法是关闭套接字。然后 read/receive 方法抛出一个异常,你捕获它
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(); }
当您在 IDE 中单击“停止”按钮时,通常会立即终止(异常)/终止您的 JVM 进程。我建议 运行 您在控制台中的进程并使用 Ctrl+C 停止进程并添加 ShutdownHook:
public static void main(String[] args) { Runtime.getRuntime().addShutdownHook( new Thread( new Runnable() { @Override public void run() { System.out.println("Shutdown"); } })); }
或 运行 它在 Eclipse 中,但在 Windows/kill on Linux 从命令行界面使用 taskkill 停止以正常关闭 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