Поток с циклом завершается только если внутри него выводится в консоль какая-то информация - Java

Узнай цену своей работы

Формулировка задачи:

Swing. Вот такая вот програмка, суть которой такова: есть окно с кнопкой, за которой "прячется" несколько врагов (нажимаем - убиваем), как только убьем всех - выводим кол-во (нолик) в консоль. Чтобы не вывести кол-во врагов раньше времени - запускаем в разных потоках и ждем, пока завершится первый (выстрелы). Поток продолжает работу, пока есть враги, именно для этого прописан цикл while, но вот незадача -- информация о оставшихся врагах отображается только если внутрь цикла поместить System.out.println(), в противном случае поток не завершается и ноль так и не выводится (будь в цикле хоть пустота, хоть увеличивающаяся с каждым шагом переменная). В чем же дело? Не захотелось бы захламлять консоль и вообще проводить лишние операции.
Листинг программы
  1. import java.awt.event.*;
  2. import javax.swing.*;
  3. class MyFrame extends JFrame implements Runnable {
  4. public static int enemy=3;
  5. public MyFrame() {
  6. // TODO Auto-generated constructor stub
  7. setSize(500, 500);
  8. JButton jbtn = new JButton(String.valueOf(enemy));
  9. jbtn.addActionListener(new ActionListener() {
  10. @Override
  11. public void actionPerformed(ActionEvent e) {
  12. // TODO Auto-generated method stub
  13. enemy--;
  14. jbtn.setText(String.valueOf(enemy));
  15. }
  16. });
  17. add(jbtn);
  18. setVisible(true);
  19. }
  20. @Override
  21. public void run() {
  22. // TODO Auto-generated method stub
  23. while(enemy>0)
  24. System.out.println(); //без этого вывода поток не завершается
  25. //или мы просто не видим информацию?
  26. }
  27. }
  28. public class Main {
  29. public static void main(String[] args) {
  30. // TODO Auto-generated method stub
  31. SwingUtilities.invokeLater(new Runnable() {
  32. @Override
  33. public void run() {
  34. // TODO Auto-generated method stub
  35. Thread t1 = new Thread(new MyFrame());
  36. t1.start();
  37. new Thread(new Runnable() {
  38. @Override
  39. public void run() {
  40. // TODO Auto-generated method stub
  41. try {
  42. t1.join();
  43. } catch (InterruptedException e) {
  44. // TODO Auto-generated catch block
  45. e.printStackTrace();
  46. }
  47. System.out.println(MyFrame.enemy);
  48. }
  49. }).start();
  50. }
  51. });
  52. }
  53. }

Решение задачи: «Поток с циклом завершается только если внутри него выводится в консоль какая-то информация»

textual
Листинг программы
  1. class MyFrame extends JFrame implements Runnable {
  2.     public static int enemy=4;
  3.     public static boolean f = true;
  4.     JButton jbtn;
  5.     public MyFrame() {
  6.         // TODO Auto-generated constructor stub        
  7.         setSize(500, 500);
  8.         this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  9.         jbtn = new JButton(String.valueOf(enemy));
  10.         jbtn.addActionListener(new ActionListener() {
  11.            
  12.             @Override
  13.             public void actionPerformed(ActionEvent e) {
  14.                 // TODO Auto-generated method stub
  15.                if(f==true){
  16.                    run();
  17.                }
  18.                
  19.             }
  20.         });
  21.        
  22.         add(jbtn);
  23.         setVisible(true);
  24.     }
  25.  
  26.     @Override
  27.     public void run() {
  28.         // TODO Auto-generated method stub        
  29.            enemy--;
  30.            jbtn.setText(String.valueOf(enemy));    
  31.            if (enemy<=0){
  32.                f=false;
  33.                jbtn.setEnabled(f);
  34.            }
  35.     }
  36. }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

9   голосов , оценка 4.222 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы