JAVA线程问题

JAVA线程问题,java,multithreading,actionlistener,Java,Multithreading,Actionlistener,我正试图使当我按下一个按钮时,程序在一个新线程中启动一个方法。 问题是,当我按下按钮时,程序冻结,直到方法运行完毕,就像我根本没有使用线程一样。有人知道如何解决这个问题吗 谢谢你,摩根 public Listeners() { Calendar.ButtonAddReminder.addActionListener(new ButtonAddListener()); } private class ButtonAddListener implements 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();
  }
}

从这一点来看,它看起来像是
Calendar.rementer.addrementer()
Calendar.rementer.rementerchecker()
中的某些东西,因为EDT中正在发生这种情况,所以需要一些时间并锁定UI

编辑:哦,我明白了。你没有做你认为你在做的事。您正在当前线程中执行
提醒检查
。该方法返回的
Runnable
是在新线程中执行的。要在线程中运行
提醒检查
,请执行以下操作:

new Thread(new Runnable() {
    public void run() {
        Calendar.reminder.Reminderchecker(...);
    }
}).start();
更好:不要像那样产生你自己的随机线程。使用有组织的并发策略,如。该类允许您轻松创建几个涵盖常见用途的类


更好的方法是:查看和它。

从这一点来看,它看起来像是
日历中的某个东西。提醒。添加提醒()
日历。提醒。提醒检查()
需要一些时间并锁定用户界面,因为这是EDT中发生的事情

编辑:哦,我明白了。你没有做你认为你在做的事。您正在当前线程中执行
提醒检查
。该方法返回的
Runnable
是在新线程中执行的。要在线程中运行
提醒检查
,请执行以下操作:

new Thread(new Runnable() {
    public void run() {
        Calendar.reminder.Reminderchecker(...);
    }
}).start();
更好:不要像那样产生你自己的随机线程。使用有组织的并发策略,如。该类允许您轻松创建几个涵盖常见用途的类


更好的方法是:查看和它。

您需要确保所有这些都发生在新线程中:

Calendar.reminder.Reminderchecker(Calendar.reminder.addReminder(date, str ))
此刻

Calendar.reminder.addReminder(date, str )

在构造和启动新的
线程之前,在事件调度线程上调用

最简单的纠正方法是创建一个新的
Runnable
对象来执行所有这些步骤,然后将其传递给新线程。我猜从Reminderchecker()返回的对象本身就是一个可运行的对象,在这种情况下,您需要如下内容:

Runnable task = new Runnable() {
    public void run() {
        Runnable r = Calendar.reminder.Reminderchecker(Calendar.reminder.addReminder(date, str ));
        r.run();
    };
new Thread(task).start();

您需要确保所有这些都在新线程中发生:

Calendar.reminder.Reminderchecker(Calendar.reminder.addReminder(date, str ))
此刻

Calendar.reminder.addReminder(date, str )

在构造和启动新的
线程之前,在事件调度线程上调用

最简单的纠正方法是创建一个新的
Runnable
对象来执行所有这些步骤,然后将其传递给新线程。我猜从Reminderchecker()返回的对象本身就是一个可运行的对象,在这种情况下,您需要如下内容:

Runnable task = new Runnable() {
    public void run() {
        Runnable r = Calendar.reminder.Reminderchecker(Calendar.reminder.addReminder(date, str ));
        r.run();
    };
new Thread(task).start();

假设您的
Calendar
类实现了
Runnable
或扩展了
Thread
,您不应该在启动新线程之前调用
Calendar.rementer.rementerchecker(Calendar.rementer.addrementer(date,str))
,因为这会调用新线程的
run()
方法

相反,你可以这样做:

public class Calendar implements Runnable {
    public void run() {
        this.reminder.Reminderchecker(Calendar.reminder.addReminder(date, str ));
    }    
}

假设您的
Calendar
类实现了
Runnable
或扩展了
Thread
,您不应该在启动新线程之前调用
Calendar.rementer.rementerchecker(Calendar.rementer.addrementer(date,str))
,因为这会调用新线程的
run()
方法

相反,你可以这样做:

public class Calendar implements Runnable {
    public void run() {
        this.reminder.Reminderchecker(Calendar.reminder.addReminder(date, str ));
    }    
}

是的,提醒检查需要时间运行,这就是为什么我希望它在新线程中运行而不锁定系统。可以这样做吗?是的,提醒检查需要时间运行,这就是为什么我希望它在新线程中运行而不锁定系统。有可能这样做吗?