当前位置: 首页 > 知识库问答 >
问题:

主线程冻结所有其他线程,包括java gui线程

安聪
2023-03-14

注意:我工作了很多时间并研究了google和stackoverflow,但我找不到答案。

我用线。sleep(),它冻结了所有其他JDialog、JFrame和线程。

我的示例代码:

public Guitest()
{
    setSize(300,300);


    // create a JDialog that make guitest wait
    MyDialog dlg = new MyDialog();
    dlg.setSize(100,100);
    dlg.setVisible(true);

    while(dlg.isWait())
    {
        try
        {
            Thread.sleep(1000);
        } catch (InterruptedException ex)
        {
            Logger.getLogger(Guitest.class.getName()).log(Level.SEVERE, null, ex);
        }
        System.out.println("waiting mydialog");
    }


}


class MyDialog extends JDialog
{
    boolean wait = true;
    JButton btn = new JButton("OK");

    public MyDialog()
    {
        setSize(50,50);

        btn.addActionListener(new ActionListener()
        {

            @Override
            public void actionPerformed(ActionEvent e)
            {
                wait=false;
            }
        });
        add(btn);
    }

    public boolean isWait()
    {
        return wait;
    }
}

在这种情况下,JDialog无法正确显示:

inccorect出现jdialog

但它必须符合这一点:

true出现jdialog

我怎样才能解决这个问题。我想让主线程等待另一个线程。有人可以纠正我的示例代码,或者在这种情况下共享示例代码。

共有2个答案

钮高朗
2023-03-14

线程。睡眠()只是让当前线程Hibernate(即停止它做任何事情,例如重绘、处理点击等),在您的例子中是UI线程

您需要使用辅助线程。任何需要完成的主要工作都需要在它自己的线程中完成,这就是你想要睡眠的线程。它目前与UI组件一起运行,这就是为什么你会看到它们冻结的原因。

一个很好的参考是摆动并发的留档http://docs.oracle.com/javase/tutorial/uiswing/concurrency/

以下内容也可能有用:

http://java.sun.com/developer/technicalArticles/Threads/swing/http://java.sun.com/products/jfc/tsc/articles/threads/threads1.html

穆乐逸
2023-03-14

嗯,看起来你只有一个线程在运行。首先,我们绘制JDialog,然后,由于wait标志,您将Hibernate主线程。例如,你不能执行你的按钮动作监听器,因此你不能唤醒你的线程

希望有助于理解。

 类似资料:
  • 下面是代码,我面临的问题是recordRead变量告诉线程应该从哪里开始读取记录的起点。但是我如何为每个线程设置不同的值?例如,对于thread1,它应该是0,recordsToRead应该是300,对于thread2,recordsToRead应该是300+300=600,对于最后一个线程,它应该是600以及更高的结束。pagesize=50pagesize、recordRead和recordT

  • 你好,我是多线程编程的新手。我正在尝试创建一个代码来创建一个线程THREAD1,在它完成某些事情后,它会触发另外两个线程,例如THREAD2和THREAD3,然后退出。 我写了两个可能的解决方案。 1) 使用条件变量(不起作用:在某些情况下会出现死锁): 2) THREAD1直接创建另外两个线程。 我想知道你的意见。非常感谢你

  • 来自文档:http://docs.python.org/2/library/thread 让我们在这里只讨论非守护进程线程。因为第一个引号没有特别提到非守护进程线程,所以我假设,如果主线程退出,即使是非守护进程线程也应该被杀死。然而,第二句引文却表明了另一种情况。事实上,当主线程退出时,非守护进程线程确实不会被杀死。那么,这里的第一个引用有什么意义呢?

  • 多线程其他模式 Promise Pipeline Master-Slave Serial Thread Confinement Promise 所谓Promise, 就是一个对象, 用来传递异步操作的消息. 它代表了某个未来才会知道结果的事件(通常是一个异步操作), 并且这个事件提供统一的API, 可供进一步处理. 对象的状态不受外界影响. Promise对象代表一个异步操作, 有三种状态: Pe

  • 我正在编写一个Android应用程序,它连接到蓝牙设备,读取设备发送的数据,将其添加到AChartEngine图形中,并在文本视图中显示数据。 我的Bluetooth代码与BluetoothChat示例代码中的线程实现非常相似(它与SDK一起提供)。我可以在LogCat中看到< code>ConnectedThread循环正在执行并因此获得新数据,但我的TextView在7行之后停止更新,图形间歇

  • 我打算在主线程中启动2个线程,主线程应该等到所有2个子线程完成,我就是这样做的。 在上面的代码中,确实让主线程等待子线程,但问题是,在第一个线程完成之前不会创建第二个线程。这不是我想要的。 我想要的是,这两个线程立即在主线程中创建,然后主线程等待它们完成。似乎做不到,是吗? 我想,也许我可以通过一个信号灯来完成这项工作,但还有别的方法吗?