JavaSWT线程:GUI即使在调用线程后也没有响应。停止()
假设我在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(),因为我的程序中没有任何其他线程,我也不知道如何让线程自己知道何时停止(通过更改一些参数值),因为这会降低性能,在这种情况下,这一点非常重要
下面是我的问题:
一, 为什么我的GUI没有像所有其他应用程序一样响应?Display.getDefault().asyncExec(t);
不是让t线程与主(GUI)线程并行运行吗
2 如果我不应该使用t.stop(),但由于性能原因无法在内部停止线程,我应该如何停止它
# 1 楼答案
asyncExec在GUI线程中运行它。此外,它执行Runnable。所以它只调用线程t的run方法。t甚至没有启动,所以对它调用stop不会改变任何事情。因此,实际情况是,在GUI线程中运行无限循环。当然,它会停止响应