我正在编写一个程序来监听剪贴板更改并将更改打印到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);
}
});
}
}
谢谢!
答案 0 :(得分:3)
我只是让主线程睡眠:
System.in
让至少一个(非deamon)线程保持活动非常重要,以保持您的应用程序正常运行。一个活着的线程可能是:
for(;;);
,HTTP-Request或任何其他内容)关于睡眠机制,这里有三种不同的技术:
从不这样做,它会让你的CPU忙碌:
for(;;) Thread.sleep(Long.MAX_VALUE);
此代码的意图清晰可见:
Object o = new Object();
synchronized (o) {o.wait();}
更优雅:
{{1}}
有关睡眠的讨论,请参阅How do you hang a thread in Java in one line?。
答案 1 :(得分:3)
如何在收听剪贴板时保持JVM运行?
我看不出你怎么会告诉程序以正确的方式停止听剪贴板。
我要做的就是使用标准输出打印某种消息,指示退出程序然后调用扫描仪或类似检查输入的键。这样你就可以实现两个重点:
答案 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);
}