-1

我的问题

我想从一个线程运行一个方法,它不是线程,但可能需要一些时间来执行(例如等待服务器响应)。重要的是我的无线程方法在另一个类中(这些类也是在其他类中使用的对象)。

如果您按照示例代码执行此操作,整个程序将暂停 10 秒,但我希望它继续执行其他程序代码。

有没有这样做的好方法?

我的代码

我的线程.java ( extends Thread)

public Foo foo;

public void run() {
    foo.bar();
}

Foo.java

public void bar() {
    try {
        Thread.sleep(10000);
        // Represents other code that takes some time to execute
        // (e.g. waiting for server response)
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
}

还有一个主要方法:

public static void main(String[] args) {
    MyThread t = new MyThread();
    t.foo = new Foo();
    System.out.println("Starting!");
    t.run();
    System.out.println("Done!");
}
4

5 回答 5

4

你不想调用run()Thread,你想调用start().

于 2013-09-27T14:53:21.177 回答
2

假设MyThreadextends Thread,你需要调用start()not run()

调用run()只是同步调用一个方法。

public static void main(String[] args) {
    MyThread t = new MyThread();
    t.foo = new Foo();
    System.out.println("Starting!");
    t.start(); // change here
    System.out.println("Done!");
}

start()实际上启动一个操作系统线程来运行你的代码。

于 2013-09-27T14:53:06.310 回答
0
  class MyThread extends Thread{

         public Foo foo;

         public void run() {
            foo.bar();
         }
 }

class Foo{

     public void bar() {
      try {
         boolean responseCompleted = false;
         boolean oneTimeExcution = false;
         while(!responseCompleted){
              if(!oneTimeExcution){
                       // Represents other code that takes some time to execute
                   oneTimeExcution = true;
              }
              if( your server response completed){
                      responseCompleted  = true;
              }
         }
     } catch (InterruptedException e) {
          e.printStackTrace();
     }
}


public static void main(String[] args) {
     MyThread t = new MyThread();
      System.out.println("Starting!");
     t.start();        
     System.out.println("Done!");
}
于 2013-09-27T15:03:15.697 回答
0

不要直接调用 run() 方法。

调用 start() 方法而不是 run() 方法。

直接调用 run() 方法时

该线程进入主堆栈,并一一运行。

于 2013-09-27T14:57:30.663 回答
0

在您的线程上使用 start() 而不是 run()。否则它将就像主线程调用另一个线程的方法一样,这意味着您正在主线程本身上调用 wait() 。

于 2013-09-27T14:56:24.957 回答