没有打印语句就无法执行代码
我一直在做倒计时计划,我想到了这个。
package main;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.UnsupportedAudioFileException;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
public class Gatoo extends JFrame implements ActionListener {
private int sec, min, secTot, since = 999;
private long lastTime;
private JTextField mm = new JTextField(2), ss = new JTextField(2);
private JLabel minLab = new JLabel("Minutes:"), secLab = new JLabel(
"Seconds:");
private JButton start = new JButton("Start");
private Clip done;
private boolean started = false;
private static final long serialVersionUID = 4277921337939922028L;
public static void main(String[] args) {
Gatoo cake = new Gatoo("Title");
cake.pack();
cake.setSize(800, 600);
cake.setLocationRelativeTo(null);
cake.setDefaultCloseOperation(3);
cake.setVisible(true);
cake.run();
}
public Gatoo(String s) {
super(s);
setLayout(new FlowLayout());
start.addActionListener(this);
add(minLab);
add(mm);
add(secLab);
add(ss);
add(start);
}
@Override
public void actionPerformed(ActionEvent e) {
started = true;
}
public void play(File file) throws MalformedURLException,
UnsupportedAudioFileException, IOException,
LineUnavailableException {
AudioInputStream ais = AudioSystem.getAudioInputStream(new File(
"lib/done.wav"));
DataLine.Info info = new DataLine.Info(Clip.class, ais.getFormat());
done = (Clip) AudioSystem.getLine(info);
done.open(ais);
done.start();
}
public void run() {
while (true) {
System.out.print("");// needed?
if (started) {
try {
min = Integer.parseInt(mm.getText());
sec = Integer.parseInt(ss.getText());
secTot = (min * 60) + sec;
lastTime = System.currentTimeMillis();
while (secTot > 0) {
since = (int) (System.currentTimeMillis() - lastTime);
if (since > 998) {
lastTime = System.currentTimeMillis();
secTot--;
}
}
play(new File("done.wav"));
} catch (NumberFormatException exception) {
System.out.println("Minutes and seconds must be numbers.");
return;
} catch (Exception exception) {
exception.printStackTrace();
}
started = false;
}
}
}
}
在while循环的最后,没有内部的print / println语句,倒计时代码将不会执行。怎么会?该程序可以很好地与print语句一起工作。
-
首先,您的程序是 线程不安全的, 因为它
boolean started
是一个 共享变量 ,但是volatile
在同步块中既不访问也不访问。现在,偶然地
PrintStream#print
是一种同步方法,并且在任何实际架构上,使用 内存屏障
CPU指令来实现进入和退出同步块,这会导致线程本地状态与主内存之间的完全同步。因此, 纯属偶然 ,添加
print
调用允许started
一个线程(EDT)对标志的设置对另一线程(主线程)可见。
-
org.hibernate.exception.SQLGrammarException:无法执行语句
2021-02-01 关注 0 浏览96 1答案
-
Java 无法执行jar-file:“没有主清单属性”
2021-02-02 关注 0 浏览96 1答案
-
语句执行与同步方法执行交织
2021-01-30 关注 0 浏览74 1答案
-
SQLGrammarException:无法执行查询
2021-02-01 关注 0 浏览126 1答案
-
无法执行SQL查询
2021-05-10 关注 0 浏览67 1答案
-
Crontab无法执行Python脚本
2021-01-29 关注 0 浏览143 1答案
-
Maven-无法执行JAR
2021-01-30 关注 0 浏览68 1答案
-
内联Java导致javascript无法执行
2021-02-01 关注 0 浏览153 1答案
-
无法执行CommandLineRunner-Spring Batch
2021-02-02 关注 0 浏览364 1答案
-
无法执行rsDriver(连接被拒绝)
2021-02-01 关注 0 浏览326 1答案