SWT线程:即使在调用thread.stop()之后GUI也没有响应

时间:2014-08-13 22:29:08

标签: java multithreading user-interface thread-safety swt

说我在SWT按钮中有这个代码:

Button btn = new Button(shell, SWT.NONE);
btn.addSelectionListener(new SelectionAdapter() {
//... some code...
                Thread t = new Thread(){
                    public void run()
                    {
                        //some function that includes **INFINITE LOOP** in that 
                       //sends a lot of UDP packets.
                    }
                };
                Display.getDefault().asyncExec(t); 
                try{
                Thread.sleep(5*1000);}
                catch(Exception e1)
                {
                    e1.printStackTrace();
                }
                t.stop();
                System.out.println("message");
//and some more code...

当我运行此程序时,大约在5秒后它会显示在控制台message中 但是GUI停止响应,当我查看任务管理器时,我看到我的cpu(i7-4700mq)没有完全加载 - 所有其他应用程序运行正常。不仅如此,我可以看到线程仍在运行 - 通过Wireshark(或任务管理器),我可以看到udp数据包仍在发送。

我需要使用t.stop(),因为我的程序中没有任何其他线程,我不知道是什么让线程本身知道何时停止(通过更改某些参数值)因为这会减少性能,在这种情况下非常重要。
所以这是我的问题:
1。为什么我的GUI不像所有其他应用程序一样响应?是不是Display.getDefault().asyncExec(t);使t线程与主(GUI)线程并行运行?

2。如果我不应该使用t.stop(),但不能在内部停止线程,因为性能,我应该如何阻止它?

1 个答案:

答案 0 :(得分:3)

asyncExec在GUI线程中运行它。而且,它执行Runnable。所以它只是调用你的Thread t的run方法。 t甚至没有启动,所以在它上面调用stop不会改变任何东西。所以实际发生的是你在GUI线程中运行一个无限循环。当然它停止响应。