#java #java-threads
#Ява #java-потоки
Вопрос:
Я новичок в кодировании и написал очень простой java-код, используя концепцию потоков. Я попытался напечатать два утверждения «доброе утро» и «добро пожаловать» бесконечно, используя два разных потока из двух классов, чтобы увидеть поведение потоков. Однако во время нескольких запусков я заметил, что иногда на выходе первая строка показывала неполный текст, хотя и не в каждом отдельном запуске. Может кто-нибудь объяснить, что происходит?
class Mythread1 extends Thread{ public void run(){ while (true) { System.out.println("good morning"); } } } class Mythread2 extends Thread{ public void run(){ while (true) { System.out.println("welcome"); } } } public class threads{ public static void main(String[] args) { Mythread1 t1=new Mythread1(); Mythread2 t2=new Mythread2(); t1.start(); t2.start(); } }
rning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning welcome welcome welcome welcome welcome welcome welcome welcome welcome welcome welcome welcome welcome welcome welcome welcome welcome welcome welcome welcome welcome welcome welcome welcome welcome welcome welcome welcome welcome welcome welcome welcome welcome welcome welcome welcome welcome welcome welcome welcome welcome welcome welcome welcome welcome welcome welcome welcome welcome welcome welcome welcome welcome welcome welcome welcome welcome
Я приостановил вывод, так как он был бесконечным.
Снова бегу
ng good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning good morning
Комментарии:
1. Я приостановил вывод, так как он был бесконечным. Пахнет так, как будто у вашего терминала есть ограничение буфера, и он просто отбрасывает самые старые символы.
2. Может быть, в вашем окне вывода (например, консоли) не хватает места? Или это также происходит, например, с десятью отпечатками?
3. Извергание текста как можно быстрее приведет к стрессу в вашем эмуляторе терминала. Возможно, подумайте о некоторых задержках в ваших узких петлях.
4. Дисплей терминала не имеет ничего общего с Java
Ответ №1:
Я думаю, вы ожидали такой вещи, как:
good morning good morning welcome good morning welcome good morning welcome welcome ...
Но дело в том, что здесь потоки не остаются навсегда и выполняются параллельно друг другу. Он выполняет, затем прыгает, выполняет, затем прыгает,…. Кроме того, while(true) выполняется слишком быстро, что в первый раз приведет вас в замешательство, если вы установите thread.sleep(10), результат будет очень заметным
Попробуйте это:
class Mythread1 extends Thread{ public void run(){ while (true) { System.out.println("good morning"); try { Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); }} } } class Mythread2 extends Thread{ public void run(){ while (true) { System.out.println("welcome"); try { Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } } } } public class threads{ public static void main(String[] args) { Mythread1 t1=new Mythread1(); Mythread2 t2=new Mythread2(); t1.start(); t2.start(); } }
Комментарии:
1. я попробовал использовать метод сна, и на этот раз все было нормально.
2. просто понял, что это не имеет ничего общего с самими потоками, так как я попытался напечатать «доброе утро» в обычном бесконечном цикле, и возникла та же проблема’
Ответ №2:
Это то же самое, если вы измените свой код на,
class Mythread1 extends Thread{ public void run(){ while (true) { System.out.println("good morning"); try { Thread.sleep(100); catch(InterruptedException e) { System.out.println("Interrupted"); } } } } class Mythread2 extends Thread{ public void run(){ while (true) { System.out.println("welcome"); try { Thread.sleep(100); catch(InterruptedException e) { System.out.println("Interrupted"); } } } }
while(true)
Цикл-это то, что выполняется очень быстро.
Более того, вы могли бы использовать PrintWriter
вместо медленного System.out.println
.
class Mythread1 extends Thread{ public void run(){ PrintWriter writer = new PrintWriter(System.out); while (true) { writer.println("good morning"); writer.flush(); } } } class Mythread2 extends Thread{ public void run(){ PrintWriter writer = new PrintWriter(System.out); while (true) { writer.println("welcome"); writer.flush(); } } }
Комментарии:
1. это нормально после того, как я попробовал метод сна
2. я попытался напечатать «доброе утро» в обычном бесконечном цикле, и возникла та же проблема. Похоже, проблема заключается в самом бесконечном цикле, а не в потоках.