【问题标题】:A class inherited from Thread makes CPU run 100%从Thread继承的一个类让CPU运行100%
【发布时间】:2013-11-26 01:27:12
【问题描述】:

我的应用程序中有这样的代码,我想在后台运行:

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 & 启动它,但结果是一样的。我猜在 Windows 上也是如此,虽然我现在关心的是 Linux。

我该怎么办?

【问题讨论】:

标签: java linux multithreading keyboard


【解决方案1】:

您有一个运行无限循环的线程。这正是那种将 100% 的 CPU 毫无用处的东西。如果不出意外,在循环中放几秒钟 Thread.sleep() 会降低 CPU 使用率。

【讨论】:

  • 它可以休眠的最长时间为 0.5 秒。使用 Thread.sleep 有意义吗?
  • @Alex 是的。半秒对于 CPU 来说是一个巨大的时间。
  • @Alex 你应该能够将任意长参数传递给Thread.sleep
  • 是吗?我认为只从几秒钟开始就足够合理了。
  • 将 Thread.sleep(1) 放入循环中并注意它如何降低 CPU 使用率。
【解决方案2】:

您应该避免使用永恒循环来检查变量是否已更改,而应使用侦听器。更准确地说,FlavorListener 将允许您在剪贴板更改时执行代码。

应该是这样的:

    Toolkit.getDefaultToolkit().getSystemClipboard().addFlavorListener(
        new FlavorListener() { 
        @Override 
        public void flavorsChanged(FlavorEvent e) { 
            System.out.println("Clipboard contents: " + e.toString()); 
        } 
    }); 

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2016-05-16
  • 1970-01-01
  • 2017-08-06
  • 1970-01-01
  • 2014-09-25
  • 1970-01-01
  • 2012-02-24
  • 2017-08-06
相关资源
最近更新 更多