【问题标题】:How can I start thread again?如何重新启动线程?
【发布时间】:2015-10-20 17:23:10
【问题描述】:

我知道人们一次又一次地询问如何在线程停止后启动线程,而每个人都说你不能。这不是重复的,因为我没有找到解决问题的方法。

private void runInBackground() {
    new Thread(new Runnable() {

        @Override
        public void run() {
            while (running) {
                try {
                    checkPixel();
                } catch (AWTException e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }
                try {
                    Thread.sleep(1);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }).start();
}

@Override
public void nativeKeyPressed(NativeKeyEvent e) {
    // TODO Auto-generated method stub
     System.out.println("Key Pressed: " + NativeKeyEvent.getKeyText(e.getKeyCode()));
     if(NativeKeyEvent.getKeyText(e.getKeyCode()).equals("F9")){
         stop();
     }
     else if(NativeKeyEvent.getKeyText(e.getKeyCode()).equals("F10")){

     }

所以在我的代码中,我正在使用 JNativeHook 监听全局关键事件。我可以使用 F9 键成功停止 checkPixels(),但是当我想再次启动 checkPixel() 时,我不明白使用 F10 应该做什么。

checkPixel() 基本上检查像素颜色的变化

回答 为我的状态变量 running 添加了一个 if 语句,并保持 while 循环为真,这允许我在保持线程打开的同时打开/关闭该方法。谢谢Jaboyc

    private void runInBackground() {
    new Thread(new Runnable() {

        @Override
        public void run() {
            while (true) {
                if(running){
                    try {
                        checkPixel();
                    } catch (AWTException e1) {
                        // TODO Auto-generated catch block
                        e1.printStackTrace();
                    }
                    try {
                        Thread.sleep(1);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }).start();
}

【问题讨论】:

  • 我不完全明白你的代码在做什么,但你为什么不能再打电话给runInBackground()
  • stop() 方法有什么作用?您应该以原子方式将 running 更改为 true/false
  • How pause and then resume a thread? 的可能重复项(我知道您说它不是重复项,但实际上是。您想要的功能已经被请求)
  • @Ray 由于某种原因调用 runInBackground() 不起作用,我试过了
  • @VinceEmigh stop() 方法将运行中的while循环中的变量设置为false

标签: java multithreading keylistener


【解决方案1】:

这样可以吗

while (true) {
    if (running) {
        doStuff();
    }
}

在run方法中?

【讨论】:

  • 这和他已经拥有的while(running) doStuff() 一样。他没有向我们展示他是否真的改变了它的价值。我建议在反对票到来之前删除这个答案
  • 哇,这确实有效,因为它使线程始终运行,非常感谢。哇,高中二年级,嗯?令人印象深刻,比我大学时的高年级学生更聪明:) 再次感谢你,非常简洁的修复
猜你喜欢
  • 1970-01-01
  • 2012-03-25
  • 2020-08-22
  • 1970-01-01
  • 1970-01-01
  • 2010-12-25
  • 1970-01-01
相关资源
最近更新 更多