手动停止无限线程后如何调用方法

how to call a method once an endless thread is stopped manually

我的代码中有一个无穷无尽的线程 运行。此线程创建 UDP 读取方法并无休止地侦听连接。

我想做的是在手动停止线程执行后执行一段代码(通过单击 eclipse 中的停止按钮)。

他们是实现这一目标的可能方法吗?

在搜索相同的内容时,我遇到了一个 onDestroy() 方法,但遗憾的是,它仅适用于 Android Java !!!

  1. 首先,停止网络读取线程的正确方法是关闭套接字。然后 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();
    }
    
  2. 当您在 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