2013-09-17 3 views
3

Я начинаю поток, который бесконечно циклически до тех пор, пока не произойдет определенное событие. Проблема в том, что я хочу начать этот поток, а затем вернуться к нормальному исполнению моей программы. Однако после запуска потока код кажется застрявшим.Java: Как продолжить выполнение после запуска потока?

Код:

public void init() 
{ 
    Runnable thread = new Runnable() 
    { 
    public void run() 
    { 
     while(something) 
     { 
      //do something 
     } 
    }   
    }; 
    System.out.println("Starting thread.."); 
    new Thread(thread).run(); 
    System.out.println("Returning"); 
    return; 
} 

Когда я начинаю это, я получаю выход «Начиная нить», но я не получаю «не возвращаются», пока условия для цикла в то время как в run() перестать быть правдой.

Любые идеи, как я могу заставить его работать асинхронно?

+0

Возможный дубликат [Запустить поток в фоновом режиме в java] (http://stackoverflow.com/questions/12188659/run-thread-in-background-in-java) – Joe

ответ

11

Используйте start, а не run, чтобы начать Thread. Последний просто вызывает метод run синхронно

new Thread(thread).start(); 

Read: Defining and Starting a Thread

+1

Другими словами, без вызова 'start() 'вы действительно не разветвляете другой поток. Вызывая 'run()' вы выполняете 'Runnable' в вызывающем потоке. – Gray

+0

@Gray nicely put :) – Reimeus

1

Вы можете попробовать это в вашем коде: -

new Thread(thread).start(); 

как: -

public void init() 
{ 
    Runnable thread = new Runnable() 
    { 
    public void run() 
    { 
     while(something) 
     { 
      //do something 
     } 
    }   
    }; 
    System.out.println("Starting thread.."); 
    new Thread(thread).start(); //use start() instead of run() 
    System.out.println("Returning"); 
    return; 
} 
1

Вы хотите для вызова new Thread(thread).start() вместо run().

+0

Можете ли вы отредактировать свой ответ, чтобы объяснить, почему? – Gray

-1

Уверены ли вы в своем подходе? Вы говорите:

The thread should loop indefinitely until certain event occurs. 

это огромная потеря вычислительных ресурсов, программа в основном обязан получить медленно & неудачу. Возможно, вы захотите перевести поток в режим ожидания() и поймать InterruptedException, чтобы разбудить его при возникновении вашего события интереса. Если это предварительное понимание того, что вы пытаетесь выполнить, верно, тогда Id решительно предложит вам пересмотреть свой подход. Вычислительный ресурс дорог, не тратьте его в неустанном цикле.

+1

Это зависит от того, что он делает в цикле. Это может быть, например: 'while (начато) {item = queue.take(); doSomethingWith (пункт); } ', что было бы совершенно нормально. – assylias

+0

@assylias Если есть законное вычисление, это совершенно нормально, однако автор конкретно говорит, что «поток должен зацикливаться бесконечно до тех пор, пока не произойдет определенное событие» ... – Ace

Смежные вопросы