线程JAVA的问题

时间:2011-09-16 12:02:16

标签: java multithreading actionlistener

我正在尝试这样做,当我按下按钮时,程序在新线程中启动一个方法。 问题是,当我按下按钮时,程序会冻结,直到方法完成运行,就像我根本没有使用线程一样。有谁知道如何解决这个问题?

感谢摩根。

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();
  }
}

3 个答案:

答案 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 ));
    }    
}