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

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

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

Swing. Вот такая вот програмка, суть которой такова: есть окно с кнопкой, за которой "прячется" несколько врагов (нажимаем - убиваем), как только убьем всех - выводим кол-во (нолик) в консоль. Чтобы не вывести кол-во врагов раньше времени - запускаем в разных потоках и ждем, пока завершится первый (выстрелы). Поток продолжает работу, пока есть враги, именно для этого прописан цикл while, но вот незадача -- информация о оставшихся врагах отображается только если внутрь цикла поместить System.out.println(), в противном случае поток не завершается и ноль так и не выводится (будь в цикле хоть пустота, хоть увеличивающаяся с каждым шагом переменная). В чем же дело? Не захотелось бы захламлять консоль и вообще проводить лишние операции.
import java.awt.event.*;
import javax.swing.*;
 
class MyFrame extends JFrame implements Runnable {
    public static int enemy=3;
    
    public MyFrame() {
        // TODO Auto-generated constructor stub
        setSize(500, 500);
        
        JButton jbtn = new JButton(String.valueOf(enemy));
        jbtn.addActionListener(new ActionListener() {
            
            @Override
            public void actionPerformed(ActionEvent e) {
                // TODO Auto-generated method stub
                enemy--;
                jbtn.setText(String.valueOf(enemy));
            }
        });
        
        add(jbtn);
        setVisible(true);
 
    }
 
    @Override
    public void run() {
        // TODO Auto-generated method stub
        while(enemy>0) 
            System.out.println();   //без этого вывода поток не завершается
                                        //или мы просто не видим информацию?
    }
    
}
 
public class Main {
 
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        SwingUtilities.invokeLater(new Runnable() {
            
            @Override
            public void run() {
                // TODO Auto-generated method stub
                Thread t1 = new Thread(new MyFrame());
                t1.start();
                
                new Thread(new Runnable() {
                    
                    @Override
                    public void run() {
                        // TODO Auto-generated method stub
                        try {
                            t1.join();
                        } catch (InterruptedException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                        System.out.println(MyFrame.enemy);
                    }
                }).start();
                
            }
        });
    }
 
}

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

textual
Листинг программы
class MyFrame extends JFrame implements Runnable {
    public static int enemy=4;
    public static boolean f = true;
    JButton jbtn;
    public MyFrame() {
        // TODO Auto-generated constructor stub        
        setSize(500, 500);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jbtn = new JButton(String.valueOf(enemy));
        jbtn.addActionListener(new ActionListener() {
            
            @Override
            public void actionPerformed(ActionEvent e) {
                // TODO Auto-generated method stub
               if(f==true){
                   run();
               }
                
            }
        });
        
        add(jbtn);
        setVisible(true);
    }
 
    @Override
    public void run() {
        // TODO Auto-generated method stub        
           enemy--;
           jbtn.setText(String.valueOf(enemy));    
           if (enemy<=0){
               f=false;
               jbtn.setEnabled(f);
           }
    }
}

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


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

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

9   голосов , оценка 4.222 из 5
Похожие ответы