主线程冻结所有其他线程,包括JavaGUI线程
注意:我花了很多时间研究谷歌和stackoverflow,但我找不到答案 我在JDialog中使用Thread.sleep(),它冻结了所有其他JDialog、JFrame和线程 我的示例代码:主线程冻结所有其他线程,包括JavaGUI线程,java,multithreading,swing,awt,sleep,Java,Multithreading,Swing,Awt,Sleep,注意:我花了很多时间研究谷歌和stackoverflow,但我找不到答案 我在JDialog中使用Thread.sleep(),它冻结了所有其他JDialog、JFrame和线程 我的示例代码: public Guitest() { setSize(300,300); // create a JDialog that make guitest wait MyDialog dlg = new MyDialog(); dlg.setSize(100,100);
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无法正确显示:
但必须是这样的:
我怎样才能解决这个问题。我想让主线程等待另一个线程。有人可以更正我的示例代码,或者在这种情况下共享示例代码。IMHO,看起来您只有一个正在运行的线程。首先,我们绘制JDialog,然后,由于wait标志,您将休眠主线程。 你不能执行你的按钮动作监听器,因此你不能唤醒你的线程
希望这有助于理解。嗯,看起来你只有一个正在运行的线程。首先,我们绘制JDialog,然后,由于wait标志,您将休眠主线程。 你不能执行你的按钮动作监听器,因此你不能唤醒你的线程 希望它有助于理解。
Thread.Sleep()
只休眠当前线程(即阻止它执行任何操作,如重画、处理单击等),在您的情况下,这就是UI线程
您需要使用辅助线程。任何需要完成的、可能需要花费大量时间的主要工作都需要在自己的线程中完成,而这正是您想要睡眠的线程。它目前与UI组件一起运行,这就是为什么您会看到它们冻结的原因
swing
以下内容也可能有用:
Thread.Sleep()
只休眠当前线程(即阻止它执行任何操作,如重画、处理单击等),在您的情况下,这就是UI线程
您需要使用辅助线程。任何需要完成的、可能需要花费大量时间的主要工作都需要在自己的线程中完成,而这正是您想要睡眠的线程。它目前与UI组件一起运行,这就是为什么您会看到它们冻结的原因
swing
以下内容也可能有用:
我不这么认为,你必须自己实施。我发现了这条线索:谢谢你的帮助,我明白了。我应该用Java学习很多东西。:)我不这么认为,你必须自己实施。我发现了这条线索:谢谢你的帮助,我明白了。我应该用Java学习很多东西。:)它们都在UI线程上运行,该线程被thread.sleep()
锁定。当在工作线程上执行时,它将产生不同的影响,但它当前与UI组件一起运行,这就是为什么您会看到它们被锁定的原因!它们都在UI线程上运行,该线程被thread.sleep()
锁定。当在工作线程上执行时,它将产生不同的影响,但它当前与UI组件一起运行,这就是为什么您会看到它们被锁定的原因!