【问题标题】:Terminate Java Thread on Key终止键上的 Java 线程
【发布时间】:2014-03-30 17:22:57
【问题描述】:

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

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

我想在用户按下例如ctrl+c 时终止while 循环或线程本身。该线程包含一个睡眠命令,我不希望用户必须按住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
}

【问题讨论】:

  • 使用keyListener 并在操作中使用interrupt the thread 或使用condition inside while as false
  • 似乎就像您在询问在运行程序的终端上输入 ctrl+c 吗?这将终止 JVM 和所有线程。如果您的意思是您实际上希望用户能够在您的 GUI 应用程序获得焦点时按 ctrl+c ......那么发布的答案应该会有所帮助。

标签: java multithreading keylistener


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    试试这样的

    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){
                        }
        }
    }
    

    【讨论】:

    • 是的,您指出了问题。我已经更改了我认为应该可以工作的代码
    【解决方案3】:

    创建一个名为“running”的布尔值

    将您的 while 循环更改为 while(running)

    添加一个按键监听器,让它监听 Ctrl + C。

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

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

    【讨论】:

    • 那如何解决线程当前休眠的问题?
    猜你喜欢
    • 2014-11-18
    • 2012-08-28
    • 1970-01-01
    • 2015-12-21
    • 2011-08-11
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多