我正在尝试这样做,当我按下按钮时,程序在新线程中启动一个方法。 问题是,当我按下按钮时,程序会冻结,直到方法完成运行,就像我根本没有使用线程一样。有谁知道如何解决这个问题?
感谢摩根。
public Listeners()
{
Calendar.ButtonAddReminder.addActionListener(new ButtonAddListener());
}
private class ButtonAddListener implements ActionListener
{
public void actionPerformed(ActionEvent e) {
new Thread(Calendar.reminder.Reminderchecker(Calendar.reminder.addReminder(date, str))) .start();
}
}
答案 0 :(得分:4)
由此看来,Calendar.reminder.addReminder()
或Calendar.reminder.Reminderchecker()
中的某些内容需要花费一些时间并锁定用户界面,因为这就是EDT中发生的事情。
编辑:哦,我明白了。你没有做你认为自己在做的事情。您正在当前线程中执行Reminderchecker
。该方法返回的Runnable
是在新线程中执行的内容。要在线程中运行Reminderchecker
,请执行以下操作:
new Thread(new Runnable() {
public void run() {
Calendar.reminder.Reminderchecker(...);
}
}).start();
更好:不要像这样生成你自己的随机线程。使用有组织的并发策略,例如ExecutorService
提供的策略。 Executors
类可以让您轻松创建几个涵盖常见用途的类。
还是更好:查看SwingWorker及其API docs。
答案 1 :(得分:1)
您需要确保在新线程中发生所有这些:
Calendar.reminder.Reminderchecker(Calendar.reminder.addReminder(date, str ))
目前
Calendar.reminder.addReminder(date, str )
和
Calendar.reminder.Reminderchecker()
在构建并启动新的Thread
之前,在事件调度线程上调用。
解决此问题的最简单方法是创建一个执行所有这些步骤的新Runnable
对象,然后将其传递给新线程。我猜Reminderchecker()返回的对象本身就是Runnable
,在这种情况下你需要这样的东西:
Runnable task = new Runnable() {
public void run() {
Runnable r = Calendar.reminder.Reminderchecker(Calendar.reminder.addReminder(date, str ));
r.run();
};
new Thread(task).start();
答案 2 :(得分:1)
假设您的Calendar
类实现Runnable
或扩展Thread
,则在启动新线程之前不应调用Calendar.reminder.Reminderchecker(Calendar.reminder.addReminder(date, str ))
,因为这会调用run()
方法新线程。
而是做类似的事情:
public class Calendar implements Runnable {
public void run() {
this.reminder.Reminderchecker(Calendar.reminder.addReminder(date, str ));
}
}