Java线程去的时候不睡在注重OSX(Java thread goes to sleep when

2019-09-16 08:44发布

我正在写监听到系统剪贴板更改的程序。 侦听器在一个单独的线程运行并执行一些动作(比如,写文件)时的剪贴板的内容发生变化。

我投票使用剪贴板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这个问题。

这就像线程去当程序失去焦点睡觉,但是当它醒来的最后一个事件的触发依然闪光。 有没有什么办法可以防止这种睡眠?

Answer 1:

我怀疑OSX不提供的剪贴板变化的通知,所以Java被通知你时,它被唤醒了其他一些原因做得最好的就可以了。

我的怀疑来自于NSPasteboard文档中, changeCount日常特别。 它说:“因此,你可以记录下你拿纸板的所有权,后来它从changeCount返回的值进行比较,以确定是否还有所有权的时间变化计。” 使用事件检测的变化没有提到。



Answer 2:

基思似乎是正确的。 但是,您可以通过发送应用背景(在* nix)做一个变通方法:

java -jar clipboard-1.0.jar &

这将打开在后台的Java应用程序,不需要窗口焦点通知解雇。



Answer 3:

我想使用此解决方案但它没有为我做的伎俩,想法? 请注意,现在没有在java中的Mac OS X端口的错误: http://java.net/jira/browse/MACOSX_PORT-511

这是我的源代码:


import java.awt.Toolkit;  
import java.awt.datatransfer.*;  
import java.io.IOException;  

public class ClipboardListener extends Thread implements ClipboardOwner {

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

    public void run(){  
        Transferable selection = systemClipboard.getContents(this);  
        gainOwnership(selection);  
        while (true) {}
    }  

    public void gainOwnership(Transferable t){ 
        try {this.sleep(100);} 
        catch (InterruptedException e) {}
        systemClipboard.setContents(t, this);  
    }  

    public void lostOwnership(Clipboard clipboard, Transferable contents) {
        try {System.out.println((String) clipboard.getData(DataFlavor.stringFlavor));} 
        catch (UnsupportedFlavorException e) {} 
        catch (IOException e) {}
        gainOwnership(contents);  
    }  
}

public class myApp {

    public static void main(String[] args){
        ClipboardListener listener = new ClipboardListener();
        listener.start();}
}


文章来源: Java thread goes to sleep when not in focus on OSX