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

时间:2016-05-10 13:33:53

标签: java eclipse infinite-loop java-threads

我的代码中运行了无休止的线程。该线程创建UDP读取方法并无休止地监听连接。

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

他们有可能实现这个目标吗?

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

1 个答案:

答案 0 :(得分:0)

  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");
                    }
                }));            
    }
    
  3. 或在Eclipse中运行它,但在Windows上使用taskkill停止/从命令行界面在Linux上执行kill以正常关闭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