在密钥上终止Java线程

时间:2014-02-27 10:33:54

标签: java multithreading keylistener

我正在编写一个java swing程序,它涉及使用线程来更新UI,

线程中的run函数包含while循环和睡眠定时器

我希望在用户按下例如ctrl+c时终止while循环或线程本身。该线程包含一个sleep命令,我不希望用户必须按住ctrl+c才能终止,我只希望能够使用这些键一次。

这怎么可能?


public static void main(String[] args) {
    .......//Code to set up window

    Thread thread = new Thread(){
        @Override
        public void run() {
            while(user has not terminated the program with ctrl+c){
                //Do Something
                try{
                    Thread.sleep(5000);
                }catch(InterruptedException e){
                }
            }
        }

    };

    .......//Code to start thread
}

3 个答案:

答案 0 :(得分:2)

在Java中,线程是协同终止的。这意味着它需要修改线程内的代码以及线程外的代码。在线程外部,您可以使用Thread.interrupt()方法通知线程应准备关闭。在线程内部,您应该检查Thread.interrupted()以测试中断(如果是这种情况,则从循环中断)。您还应该修改您的异常处理程序;在线程处于休眠状态时调用Thread.interrupt()时抛出中断的异常,因此您应该修改该处理程序的内容以从循环中断开。

答案 1 :(得分:1)

尝试这样的事情

class A{
Thread r1Thread;
public static boolean isCtrlCPressed = false;
public static void main(String[] args) {
    .......//Code to set up window
    MyRun r1 = new MyRun();
    r1Thread = new Thread(r1);
    r1Thread.start();
   }

   public void someMethodThatDetectCtrlC(){
      r1Thread.interrupt();
   }

}

你的主题

       class MyRun implements Runnable{
        @Override
        public void run() {
                // TODO Auto-generated method stub
                   try{

                        Thread.sleep(5000);

                    }catch(InterruptedException e){
                    }
    }
}

答案 2 :(得分:-1)

制作名为“running”的布尔值

将while循环更改为while(running)

添加一个keylistener,让它听取Ctrl + C.

如果它听到Ctrl + C,请设置running = false。

由于运行== false,while循环将停止。