【问题标题】:How do I run a thread on JButton?如何在 JButton 上运行线程?
【发布时间】:2016-03-11 18:51:21
【问题描述】:

我正在学习 Herbert Schidlt 的“The Complete Reference”中的 Java。 在本书中,建议如果您的 GUI 的任何部分需要做一些可能需要更长的事件生成时间的事情,那么我们应该将该事情作为一个新线程来实现。

所以,我制作了一个 GUI 来将邮件发送到我的收件箱,它工作正常,但发送邮件需要 2-3 秒,因此发送按钮也需要时间恢复到正常状态(它一直按下直到侦听器响应,因为在侦听器中,我已经实现了发送邮件的代码。

为了避免这种情况,我试图在这个“发送”按钮上运行一个线程,这样当按下按钮时,将生成一个 mouseEvent,并且在那个 mouseEvent 上,我想运行这个线程以便监听器立即回复并通过线程发送邮件。

我如何实施这个方案?我尝试在 MouseEvent 中将新的 Runnable 实现为内部类,但我不知道如何调用 start 方法!

代码比较大,这里只放“发送按钮”的代码。

sendButton.addMouseListener(new MouseAdapter(){
  public void mouseClicked(MouseEvent me){

    String id=emailIdField.getText();
    String subject=subjectField.getText();
    String body=mailBodyArea.getText();                   
    String user= "emailId@somehost.com";
    String pass="password";
    String host="smtp.gmail.com";
    sendEmail= new SendEmail(); // class which actually sends the mail. defined in other file.
    sendEmail.sendMail( id, user, subject ,body ,host, user, pass ); 
}
});

我想将此 MouseClicked 函数中的代码作为新线程运行。到目前为止,我尝试过的是,

sendButton.addMouseListener(new MouseAdapter(){
  public void mouseClicked(MouseEvent me){

    new Runnable(){

                public void run(){
                   String id=emailIdField.getText();
            String subject=subjectField.getText();
            String body=mailBodyArea.getText();
            System.out.println(id);
            System.out.println(subject);
            System.out.println(body);
            String user= "razr005@gmail.com";
            String pass="impe(*&amit";
            String host="smtp.gmail.com";
            sendEmail= new SendEmail();
            sendEmail.sendMail( id, user, subject ,body ,host, user, pass ); 


                }
            };   
});

但是现在我不知道如何调用这个线程的 start 方法?请指教。

【问题讨论】:

  • 线程 t = 新线程(可运行); t.start();
  • @rkosegi 我到底在哪里写这个声明?

标签: java multithreading


【解决方案1】:

在mouseCliked函数内添加:

new Thread() {
public void run() {
    String id=emailIdField.getText();
    String subject=subjectField.getText();
    String body=mailBodyArea.getText();
    System.out.println(id);
    System.out.println(subject);
    System.out.println(body);
    String user= "razr005@gmail.com";
    String pass="impe(*&amit";
    String host="smtp.gmail.com";
    sendEmail= new SendEmail();
    sendEmail.sendMail( id, user, subject ,body ,host, user, pass );
}
}.start();

【讨论】:

  • 此示例有效,但它是一个不好的做法示例,即:每次要执行单个任务时创建一个new Thread。最好使用线程池(例如,通过ExecutorService,或使用SwingWorker),因为创建和销毁Thread 对象的成本很高。在这种情况下,不会造成任何伤害,因为系统创建和销毁线程的速度比用户单击按钮的速度要快,但即便如此,为短期任务到处调用new Thread 是一个坏习惯。
猜你喜欢
  • 2011-01-13
  • 2013-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-20
  • 2020-06-02
  • 2021-12-04
  • 1970-01-01
相关资源
最近更新 更多