Поток с циклом завершается только если внутри него выводится в консоль какая-то информация - 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);
- }
- }
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д