[英]problem with threading JAVA
我正在尝试制作一个程序,以便当我按下按钮时程序在新线程中启动一个方法。 问题是,当我按下按钮时,程序将冻结,直到该方法完成运行为止,就像我根本没有使用线程一样。 有谁知道如何解决这个问题?
谢谢摩根。
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.reminder.addReminder()
或Calendar.reminder.Reminderchecker()
内容似乎要花一些时间并锁定UI,因为这是EDT中发生的事情。
编辑:哦,我明白了。 您没有按照自己的想法去做。 您正在当前线程中执行Reminderchecker
。 该方法返回的Runnable
是新线程中正在执行的内容。 要在线程中运行Reminderchecker
,请执行以下操作:
new Thread(new Runnable() {
public void run() {
Calendar.reminder.Reminderchecker(...);
}
}).start();
更好:不要像这样产生自己的随机线程。 使用诸如ExecutorService
提供的有组织的并发策略。 使用Executors
类,您可以轻松创建一些涵盖常用功能的类。
更好的是:查看SwingWorker及其API文档 。
您需要确保所有这些操作都在新线程中发生:
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();
假设您的Calendar
类实现Runnable
或扩展Thread
Calendar.reminder.Reminderchecker(Calendar.reminder.addReminder(date, str ))
在启动新线程之前Calendar.reminder.Reminderchecker(Calendar.reminder.addReminder(date, str ))
不应调用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 ));
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.