Java - 如何在监听剪贴板更改时保持JVM运行?

时间:2016-10-24 08:38:48

标签: java clipboard keep-alive

我正在编写一个程序来监听剪贴板更改并将更改打印到stdout(这只是对更大程序的测试)。问题是:当主线程完成时,JVM退出并且没有事件到达侦听器。如何在监听剪贴板时保持JVM运行?

我的代码如下所示:

public class Test {

    public static void main(String[] args) {

        Clipboard cb = Toolkit.getDefaultToolkit().getSystemClipboard();

        cb.addFlavorListener(new FlavorListener() {
            @Override
            public void flavorsChanged(FlavorEvent e) {
                System.out.println(e);
            }
        });

    } 

}

谢谢!

3 个答案:

答案 0 :(得分:3)

我只是让主线程睡眠:

System.in

至少一个(非deamon)线程保持活动非常重要,以保持您的应用程序正常运行。一个活着的线程可能是:

  1. 主题,暂停使用
  2. 主题,暂停使用
  3. 任何 awt / swing 应用程序线程,只要至少有一个元素不存在,它通常会保持活着
  4. 任何其他线程,监听到任何界面(等待for(;;); ,HTTP-Request或任何其他内容)
  5. 关于睡眠机制,这里有三种不同的技术:

    1. 从不这样做,它会让你的CPU忙碌:

      for(;;) Thread.sleep(Long.MAX_VALUE);
      
    2. 此代码的意图清晰可见:

      Object o = new Object();
      synchronized (o) {o.wait();}
      
    3. 更优雅:

      {{1}}
    4. 有关睡眠的讨论,请参阅How do you hang a thread in Java in one line?

答案 1 :(得分:3)

  

如何在收听剪贴板时保持JVM运行?

我看不出你怎么会告诉程序以正确的方式停止听剪贴板。

我要做的就是使用标准输出打印某种消息,指示退出程序然后调用扫描仪或类似检查输入的键。这样你就可以实现两个重点:

  1. 线程不会立即死亡,因为扫描仪会执行我认为您正在寻找的“等待”部分。
  2. 用户可以控制线程的生命周期,因此他们可以在适当的时候终止它

答案 2 :(得分:0)

试试这个:

public static void listen() throws InterruptedException {
    Thread t = new Thread (new Runnable(){

        @Override
        public void run() {
            Clipboard cb = Toolkit.getDefaultToolkit().getSystemClipboard();
            Transferable contents = cb.getContents(null);
            cb.addFlavorListener(new FlavorListener() {
                @Override
                public void flavorsChanged(FlavorEvent e) {
                    try {
                        System.out.println("Got Data:"+(String)contents.getTransferData(DataFlavor.stringFlavor));
                    } catch (UnsupportedFlavorException | IOException e1) {
                        // TODO Auto-generated catch block
                        e1.printStackTrace();
                    }
                }
            });
        }
    });
    t.setDaemon(true);
    t.start();

    while (true)
        Thread.sleep(Long.MAX_VALUE);
}