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