Поток с циклом завершается только если внутри него выводится в консоль какая-то информация - 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);
}
}
}