2013-09-27 6 views
-1

Моей проблема:Вызов не класс нити от нити

Я хочу, чтобы запустить метод из потока, который не является 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!"); 
} 

ответ

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() фактически запускает поток операционной системы для запуска кода на.

4

Вы не хотите называть run() на тему, которую хотите позвонить start().

0

Используйте start(), а не run() в своей теме. Или это будет так же, как и основной поток, вызывающий метод другого потока, что означает, что вы вызываете wait() в самом основном потоке.

0

не вызывайте run() метод напрямую.

метод вызова() вместо метода run().

при запуске вызова() метод непосредственно

этой темы перейти к основной стек, и запустить его один за другим.

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!"); 
} 
Смежные вопросы