1

我的程序中有一个特定的功能,我想在按下一个键时停止。我为此目的设置了一个本机键盘挂钩。现在,当检测到该键时,我调用 System.exit(0)。但是,我不想退出程序,只需停止该操作并返回调用它的位置即可。下面给出一个例子。

public class Main {
    public static void main(String[] args) {
        System.out.println("Calling function that can be stopped with CTRL+C");
        foo(); // Should return when CTRL+C is pressed
        System.out.println("Function has returned");
    }
}

我已经尝试将 foo() 的调用放在一个线程中,以便我可以调用Thread.interrupt(),但我希望函数调用是阻塞的,而不是非阻塞的。还有阻塞的 IO 调用,foo()所以除非有必要,否则我宁愿不处理中断,因为我必须处理ClosedByInterruptException异常并且这之前已经引起了问题。

此外,它的主体foo()很长,里面有很多函数调用,所以if (stop == true) return;不能在函数中编写。

有没有比制作阻塞线程更好的方法来做到这一点?如果是这样,怎么做?如果没有,我将如何制作阻塞线程?

4

1 回答 1

1

这个怎么样?

// Create and start the thread
MyThread thread = new MyThread();
thread.start();

while (true) {
    // Do work

    // Pause the thread
    synchronized (thread) {
        thread.pleaseWait = true;
    }

    // Do work

    // Resume the thread
    synchronized (thread) {
        thread.pleaseWait = false;
        thread.notify();
    }

    // Do work
}

class MyThread extends Thread {
    boolean pleaseWait = false;

    // This method is called when the thread runs
    public void run() {
        while (true) {
            // Do work

            // Check if should wait
            synchronized (this) {
                while (pleaseWait) {
                    try {
                        wait();
                    } catch (Exception e) {
                    }
                }
            }

            // Do work
        }
    }
}

(取自http://www.exampledepot.com/egs/java.lang/PauseThread.html不是我自己的作品)

于 2012-05-09T20:11:22.800 回答