从线程调用非线程类

时间:2013-09-27 14:51:31

标签: java multithreading runnable

我的问题

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

如果你在示例代码中执行此操作,整个程序将暂停10秒,但我希望它继续使用其他程序代码。

这样做有好办法吗?

我的代码

MyThread.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!");
}

5 个答案:

答案 0 :(得分:4)

您不想在线程上呼叫run(),您想呼叫start()

答案 1 :(得分:2)

假设MyThread延长Thread,您需要致电start()而不是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()实际上启动了一个OS线程来运行你的代码。

答案 2 :(得分:0)

在你的线程上使用start()而不是run()。或者它就像主线程调用另一个线程的方法,这意味着你在主线程本身上调用wait()。

答案 3 :(得分:0)

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

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

直接调用run()方法

这个帖子转到主堆栈,它一个接一个地运行。

答案 4 :(得分: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!");
}