Java线程在不关注OSX时进入睡眠状态

Java线程在不关注OSX时进入睡眠状态,java,multithreading,macos,clipboard,Java,Multithreading,Macos,Clipboard,我正在编写一个程序,用于侦听系统剪贴板中的更改。侦听器在一个单独的线程上运行,并在剪贴板内容更改时执行某些操作(例如,写入文件) 我正在使用轮询剪贴板,这样当我的程序失去剪贴板的所有权(意味着另一个进程修改了剪贴板)时,程序中会触发一个事件,让我读取更改 public类ownershiclipboardlistener扩展线程实现剪贴簿所有者 { 私有剪贴板clipB=Toolkit.getDefaultToolkit().getSystemClipboard(); 公开募捐 { /*初始化Cl

我正在编写一个程序,用于侦听系统剪贴板中的更改。侦听器在一个单独的线程上运行,并在剪贴板内容更改时执行某些操作(例如,写入文件)

我正在使用轮询剪贴板,这样当我的程序失去剪贴板的所有权(意味着另一个进程修改了剪贴板)时,程序中会触发一个事件,让我读取更改

public类ownershiclipboardlistener扩展线程实现剪贴簿所有者
{
私有剪贴板clipB=Toolkit.getDefaultToolkit().getSystemClipboard();
公开募捐
{
/*初始化ClipboardListener并获得剪贴板的所有权*/
}
@凌驾
公共无效所有权(剪贴板,可转让)
{
/*当我失去剪贴板所有权时自动触发。
您可以在此进行处理并重新获得所有权*/
}    
}
问题是,在OSX中运行时,只有在dock中的running process图标上手动添加Cmd选项卡时,才会反映对剪贴板的任何更改。因此,如果在切换到dock图标之前有多个剪贴板操作,则只有最后一个操作有效。我不会在Linux或Windows上面对这个问题


这就像程序失去焦点时线程进入睡眠状态,但最后一个事件触发器在唤醒时仍会触发。有什么方法可以防止这种睡眠吗?

我怀疑OSX不提供剪贴板更改通知,所以Java正在尽其所能,在因其他原因被唤醒时通知您


我的怀疑来自文档,尤其是
changecont
例程。它说“因此,您可以在取得粘贴板所有权时记录更改计数,然后将其与changeCount返回的值进行比较,以确定您是否仍然拥有所有权。”没有提到使用事件检测更改。

似乎Keith是对的。但是,您可以通过将应用程序发送到后台(on*Nix)来解决此问题:


这将在后台打开Java应用程序,并且不需要窗口焦点来触发通知。

发布并似乎有类似的问题,但在大多数情况下,他们的剪贴板是执行某些数据传输的一个变通方法。实际上,我需要一直阅读剪贴板,但在本例中,lostOwnership()方法确实被触发了,只是只有当我将焦点切换到Java应用程序时才会发生。在其他系统上,即使在后台也会触发事件。我的意思是操作系统不会通知JVM发生了更改。JVM显然会为您检查changeCount,但只有当它获得一些周期时,比如当它的一个窗口获得焦点时。
java -jar clipboard-1.0.jar &