GUI中的线程(Swing) - 应用程序解冻

时间:2011-02-22 16:01:23

标签: java multithreading user-interface swing

我对Java Swing Application中的线程有疑问。我的应用程序中有一个模块,用于接收和发送电子邮件。我想为Button(mouseClicked)分配一个动作来接收未读的电子邮件。

伪代码:

ExchangeConnector ec = new ExchangeConnector();
ArrayList<Mail> unreadMails = ec.receive(Mail.UNREAD);
// (...)
ec.close();

我当前的实现使应用程序冻结,直到接收完成(有时可能需要超过10分钟)。

问题是 - 如何完全“在后台”,使我的应用程序可用于其他操作?

3 个答案:

答案 0 :(得分:5)

看看SwingWorker在Swing Thread上做这种事情。

SwingWorker是:

  

在必须在用户交互事件后执行耗时的任务时非常有用

答案 1 :(得分:2)

JohanSjöberg给出了提示:将长期运行的任务放入线程中。我还想补充一点:不要启动不同的线程(除非你真的需要这样做),而是使用一个专用的工作线程进行这样的操作。否则你会迷失在线程必杀技中。密切关注两个线程(事件调度线程和工作线程)要简单得多。

答案 2 :(得分:1)

不是阻止swing线程,而是创建一个新线程来为您执行接收。例如,

new Thread(new EmailReceiver(new ExchangeConnector())).start();

和EmailReceiver

public class EmailReceiver implements Runnable {
     private ExchangeConnnector ec;

     public EmailReceiver(ExchangeConnector ec) {
         this.ec = ec;
     }

     @Override
     public void run() {
         ec.receive(Mail.UNREAD);
     }
}