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 ));
}
}
是的,提醒检查需要时间运行,这就是为什么我希望它在新线程中运行而不锁定系统。可以这样做吗?是的,提醒检查需要时间运行,这就是为什么我希望它在新线程中运行而不锁定系统。有可能这样做吗?