我的应用程序中有这样的代码,我想在后台运行:
import java.awt.*;
import java.awt.datatransfer.*;
class Main extends Thread implements ClipboardOwner {
private Clipboard sysClip = Toolkit.getDefaultToolkit().getSystemClipboard();
public void run() {
Transferable trans = sysClip.getContents(this);
regainOwnership(trans);
System.out.println("Listening to board...");
while (true) { }
}
public static void main(String[] args) {
Main b = new Main();
b.start();
}
//............
它会监听Ctrl+C
并在按下此组合键后打印剪贴板的内容。但是,它使CPU始终运行99%。如果我删除while (true) { }
,那么应用程序将在一秒钟内停止。
我尝试将其作为java -jar myapp.jar &
启动,但结果是一样的。虽然我现在关心Linux,但在Windows上它会是相同的。
我该怎么办?
答案 0 :(得分:3)
你有一个运行无限循环的线程。这正是将100%的CPU毫无用处的事情。如果不出意外,在循环中放置几秒Thread.sleep()
会降低CPU使用率。
答案 1 :(得分:0)
您应该避免使用永久循环来检查变量是否已更改,而是使用侦听器。更准确地说,FlavorListener将允许您在剪贴板更改时执行代码。
这将是这样的:
Toolkit.getDefaultToolkit().getSystemClipboard().addFlavorListener(
new FlavorListener() {
@Override
public void flavorsChanged(FlavorEvent e) {
System.out.println("Clipboard contents: " + e.toString());
}
});