【发布时间】: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