Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/370.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java SWT线程:GUI即使在调用thread.stop()之后也没有响应_Java_Multithreading_User Interface_Thread Safety_Swt - Fatal编程技术网

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

Java SWT线程:GUI即使在调用thread.stop()之后也没有响应,java,multithreading,user-interface,thread-safety,swt,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() {

假设我在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秒后,它会显示在控制台
消息中
但随后GUI停止响应,当我查看任务管理器时,我发现我的cpu(i7-4700mq)没有完全加载-所有其他应用程序都运行正常。不仅如此,我还可以看到线程仍在运行——通过Wireshark(或任务管理器),我可以看到udp数据包仍在发送

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


二,。如果我不应该使用t.stop(),但由于性能原因无法在内部停止线程,我应该如何停止它?

asyncExec在GUI线程中运行它。此外,它执行Runnable。所以它只调用线程t的run方法。t甚至还没有启动,所以对它调用stop不会改变任何事情。所以实际发生的是,在GUI线程中运行无限循环。当然,它会停止响应。

但是如果这是真的,程序怎么可能到达
System.out.println(“消息”)
commnad?@789
asyncExec
将其参数安排在GUI线程可以运行时稍后运行。但是它已经在selection listener中运行了您的代码,其中包括此打印,并且必须在无限循环开始之前首先完成。但是如果我看到程序甚至在GUI selection listener结束之前就发送了UDP包
无论如何,我如何在SWT中以完全并发的方式tun线程?这可能吗?@789我对SWT不是很了解,但像ExecutorService和Future这样的标准java Concurrency类无论如何都应该可以工作。不是这样。请参阅:。虽然使用ExecutorService给了我SWTException的感觉,但使用Future并没有,但看起来它根本不起作用。