在线程中加载函数

时间:2011-04-14 19:18:47

标签: java multithreading

我如何使用callme(输入);用新线程启动?

  /* We send username and password for register and load a heavy load */
  public class button3 implements ActionListener
  {
    public void actionPerformed(ActionEvent e)
    {      
      String input = output.getText();
      if (input.length()<=0)
      {
        JOptionPane.showMessageDialog(null, "Empty....");
      } else {
        callme(input);
      }
    }
  }

  public static String callme() { //heavy loads... starts, which freezed the button 
     return "Did you called me?";
  }

尝试1:但是失败(output1无法获得返回的文本结果):

  /* We send username and password for register and nat mapping */
  public class button3 implements ActionListener
  {
    public void actionPerformed(ActionEvent e)
    {      
      String input = output.getText();
      if (input.length()<=0)
      {
        JOptionPane.showMessageDialog(null, "Empty....");
      } else {

        new Thread(new Runnable() {
          public void run() {
            try {
              output1.setText( callme(output.getText()) );
            } catch(Exception t) {
            }
          }
        }).start();


      }
    }
  }

尝试2:也试过这个,没有返回output1 = callme();

new Thread(new Runnable() {
  public void run() {
    final String result = callme(output.getText());
    SwingUtilities.invokeLater(new Runnable() {      
      public void run() {
        try {
            output1.setText( result );
        } catch(Exception t) {
        }
      }
    });
  }
}).start();

4 个答案:

答案 0 :(得分:3)

new Thread(new Runnable() {
  public void run() {
    try {
      callme(input);
    } catch(Exception t) {
       // appropriate error reporting here
    }
  }
}).start();

请注意,input必须声明为final

另外,请考虑使用Swing Utilities

中的invokeLater(Runnable)

答案 1 :(得分:1)

试试这个:

public class button3 implements ActionListener {
    public void actionPerformed(ActionEvent e) {
        final String input = output.getText();
        if ( input.length() <= 0 ) {
            JOptionPane.showMessageDialog(null, "Empty....");
        }
        else {
            Thread t = new Thread(new Runnable() {
                public void run() {
                    callme(input);
                }
            });
            t.start();
        }
    }

    public static String callme(String input) {}
}

答案 2 :(得分:1)

如果修改方法内的swing控件,则应使用

new Thread(new Runnable() {

    @Override
    public void run() {

        final String result = callme(input);

        SwingUtilities.invokeLater(new Runnable() {      

            @Override
            public void run() {
                try {
                    output1.setText( result );
                } catch(Exception t) {
                }
            }
        });
    }
}).start();

答案 3 :(得分:1)

如果你需要返回值,你应该使用一个带有ExecutorService的Callable,它会返回一个Future,你可以使用它来稍后检索它。

见:

http://download.oracle.com/javase/6/docs/api/java/util/concurrent/Executors.html

http://download.oracle.com/javase/6/docs/api/java/util/concurrent/ExecutorService.html