2016-03-13 2 views
0

Я собирался использовать потоки для каждого звука в игровом движке, который я делаю. Проблема в том, что всякий раз, когда я создаю новый поток, который имеет оператор while(true), другой поток перестает работать.Почему один поток останавливает работу другого потока?

Я сделал класс, чтобы проверить это, и он печатает только «до свидания», а не «привет». Мне было интересно, как заставить оба потока работать одновременно.

public class testor { 
    public static void main(String args[]){ 
     testor test=new testor(); 
     test.runTest(); 
    } 
    class threadTest implements Runnable{ 

     @Override 
     public void run() { 
      while(true){ 
       System.out.println("goodbye"); 
      } 

     } 

    } 
    public void runTest(){ 
     threadTest test=new threadTest(); 
     test.run(); 
     while(true){ 
      System.out.println("hello"); 
     } 
    } 
} 
+2

Вы не начинаете тему, просто называя 'run()'. Посмотрите здесь: https://docs.oracle.com/javase/tutorial/essential/concurrency/runthread.html – Blorgbeard

+0

oooooohhhhhhhhhhh, lol. Спасибо – user2350459

+0

Если на ваш вопрос ответили, ответьте как ответ (много ответов в одном предложении). – Matthias

ответ

2

Поскольку вы делаете test.run();вы только вызов метода этого класса, но не начинать нить.

Итак, чтобы ответить на ваш вопрос: нет такой нить, останавливающая прокрутку другой нити?, потому что у вас есть только один тему, что зацикливание навсегда и печать сообщение System.out.println("goodbye");

Если этот метод не зацикливание навсегда, было бы вернуться к методу runTest, а затем вы увидите System.out.println("hello");

Резюме:

Для начала Thread используйте метод Thread::start, а не run.

+0

Да, но что ответ на вопрос OP? – Blorgbeard

+0

Ну, ладно, но я имел в виду, что полный ответ будет описывать, как на самом деле начать поток. – Blorgbeard

2

Использование (new ThreadTest()).run() не запускает новый Thread, но просто вызывает метод run() в текущей ветке.

Для запуска кода в отдельном потоке сделать:

(new Thread(new ThreadTest())).start(); 
2

Это потому, что вы не создаете новую тему. Просто называя класс чем-то содержащим «поток», он не станет нитью, а Runnable не будет нитью - это класс, как любой другой, без специальной семантики или поведения.

Это единственное, что вы можете передать его Thread для выполнения.

public class Testor { 
    public static void main(String args[]){ 
     Testor test=new Testor(); 
     test.runTest(); 
    } 

    class MyRunnable implements Runnable{ 
     @Override 
     public void run() { 
      while(true){ 
       System.out.println("goodbye"); 
      } 
     } 
    } 

    public void runTest(){ 
     Thread testThread = new Thread(new MyRunnable()); 
     testThread.start(); 
     while(true){ 
      System.out.println("hello"); 
     } 
    } 
} 

Вы, вероятно, следует также придерживаться стандартов кодирования Java относительно вашего класса и имена переменных, если вы не хотите, чтобы ваш код выглядеть как пришелец в сочетании с большинством других существующего кода Java.

Кроме того, многопоточность - это нечто большее, чем просто возможность начать новую тему. Вы также должны прочитать о проблемах синхронизации - сложнее сделать это правильно, чем вы могли себе представить.

-1

Ваш метод run содержит бесконечный цикл. Метод runTest() создает поток, который означает, что у вас будет 2 исполнения, стеки основного стека и стека runnable threadTest. Поскольку вы используете метод потока, который содержит бесконечный цикл, вы всегда получите вывод "good Bye".

Удалить бесконечный цикл от run().

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