繁体   English   中英

JAVA线程化问题

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM