Java剪贴板访问10秒挂起

Java剪贴板访问10秒挂起,java,linux,clipboard,x11,Java,Linux,Clipboard,X11,当我得到系统剪贴板的内容时,调用很可能会挂起整整10秒钟 我遇到这种情况是因为我的弹出菜单创建偶尔会挂起,因为我正在检查剪贴板的状态以启用/禁用粘贴选项 在将范围缩小到getSystemClipboard().getContents()之后,我编写了一个控制台应用程序,它只是循环和查询它。在windows下运行良好,但在Linux和X下,我会遇到很多挂起 在我的GUI应用程序中,如果有任何UI事件(即鼠标移动),10秒的挂起时间将缩短 我还运行了指向Xvfb(headless X virtual

当我得到系统剪贴板的内容时,调用很可能会挂起整整10秒钟

我遇到这种情况是因为我的弹出菜单创建偶尔会挂起,因为我正在检查剪贴板的状态以启用/禁用粘贴选项

在将范围缩小到getSystemClipboard().getContents()之后,我编写了一个控制台应用程序,它只是循环和查询它。在windows下运行良好,但在Linux和X下,我会遇到很多挂起

在我的GUI应用程序中,如果有任何UI事件(即鼠标移动),10秒的挂起时间将缩短

我还运行了指向Xvfb(headless X virtual frame buffer)的控制台应用程序,如果只有一个控制台应用程序连接到剪贴板,它通常会成功,但是如果有几个应用程序的副本命中同一个X,那么错误就会开始发生

下面是一个示例应用程序。我想知道你是否也有同样的问题

public class main {
    public static  void main(String[] args) 
    {
        System.out.println("Clipboard class: " + Toolkit.getDefaultToolkit().getSystemClipboard().getClass() );
        long progstart_ts = System.currentTimeMillis();
        int slowcount = 0;
        int MAXLOOP = 1000;
        for(int i = 0; i < MAXLOOP; i++)
        {
            long start_ts = System.currentTimeMillis();
            Toolkit.getDefaultToolkit().getSystemClipboard().getContents(null);
            long end_ts = System.currentTimeMillis();
            long elapsed = end_ts - start_ts;

            if ( elapsed > 1000 )
            {
                System.out.println("Loop " + i + ", " + elapsed);
                slowcount++;
            }
        }
        long progend_ts = System.currentTimeMillis();
        long progelapsed = progend_ts - progstart_ts;
        System.out.println("Total time: " + progelapsed);
        System.out.println("Good/bad: " + (MAXLOOP - slowcount) + "/" + slowcount);
    }
}
公共类主{
公共静态void main(字符串[]args)
{
System.out.println(“剪贴板类:+Toolkit.getDefaultToolkit().getSystemClipboard().getClass());
long progstart_ts=System.currentTimeMillis();
int-slowcount=0;
int MAXLOOP=1000;
对于(int i=0;i1000)
{
System.out.println(“循环”+i+,“+appead”);
慢计数++;
}
}
long progend_ts=System.currentTimeMillis();
长时间运行=程序结束\u ts-程序开始\u ts;
System.out.println(“总时间:+progrased”);
System.out.println(“好/坏:”+(MAXLOOP-slowcount)+“/”+slowcount);
}
}

我怀疑与此有关。他们声称这是固定的,但挂起期间的线程转储表明AWT事件线程实际上在方法XSelection.waitForSelectionNotify.My分析中等待锁。我的分析导致相同的方法XSelection.waitForSelectionNotify。网站上说它固定在8u60和9b70中。我在8U112上发现了实际的bug,由于测试人员不称职,它没有修复就关闭了==