tangguo

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

java

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

我正在使用ClipboardOwner接口轮询剪贴板,以便当我的程序失去对剪贴板的所有权(意味着另一个进程已修改剪贴板)时,在我的程序中触发了一个事件,可让我读取更改。

public class OwnershipClipboardListener extends Thread implements ClipboardOwner
{
    private Clipboard clipB = Toolkit.getDefaultToolkit().getSystemClipboard();

    public void run()
    {
        /* Initialize ClipboardListener and gain ownership of clipboard */
    }

    @Override
    public void lostOwnership(Clipboard clipboard, Transferable transferable)
    {
        /* Auto-fired when I lose Clipboard ownership.
           Can do processing and regaining ownership here */
    }    
}

问题是,在OSX中运行时,仅当我手动将Cmd-Tab移至扩展坞中正在运行的进程图标时,剪贴板的任何更改才会反映出来。因此,如果在我切换到停靠图标之前有多个剪贴板操作,则只有最后一个才起作用。在Linux或Windows上我不会遇到此问题。

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


阅读 240

收藏
2020-11-20

共1个答案

小编典典

我怀疑OSX不会提供剪贴板更改的通知,因此Java会尽其所能,只要由于其他原因而被唤醒就通知您。

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

2020-11-20