gpt4 book ai didi

java - 为什么我的秒表程序无法运行?

转载 作者:行者123 更新时间:2023-12-02 02:52:07 24 4
gpt4 key购买 nike

我试图通过设计 GUI 秒表将我在多线程中学到的知识付诸实践。

我正在使用 Eclipse。我也尝试过调试。在 Debug模式下,当我传递语句来更改文本字段的文本时,它不会更改输出窗口中的实际文本。

更奇怪的是,有一次我的 eclipse IDE 崩溃了,并且输出窗口是打开的。然后程序就开始运行了。

这是主类,分别通过对象 I 和 T 启动两个线程前台、后台。

public class Coordinator {
public static void main(String[] args) {
Interface I = new Interface();
Thread fore = new Thread(I,"foreground");

timer T = new timer(I);
Thread back = new Thread(T, "background");

fore.start();
back.start();
}
}

这是一个线程类,每当 boolean 变量“changed”设置为 true 时,它​​就会不断更新屏幕上的文本。一旦它更新了文本,它就会再次将“changed”的值设置为 false。它还管理 GUI。 GUI 在启动、停止和重置按钮的帮助下更改 boolean 变量“正在运行”的值。

public class Interface extends JFrame implements ActionListener, Runnable {

JButton start,stop,reset;
JTextField time;
Container pane;

String Reading;

boolean Running,changed;

long centisec;

public Interface() {

Reading = "00:00:00:00";
Running = false;
changed = false;
centisec = 0;


pane = getContentPane();
pane.setBackground(Color.WHITE);
pane.setLayout(new FlowLayout());

time = new JTextField(Reading);

start = new JButton("START");
stop = new JButton("STOP");
reset = new JButton("RESET");

start.addActionListener(this);
stop.addActionListener(this);
reset.addActionListener(this);

pane.add(time);
pane.add(start);
pane.add(stop);
pane.add(reset);
}

public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub

String but = e.getActionCommand();

if (but.equals("START"))
{
Running = true;
}
if (but.equals("STOP"))
{
Running = false;
}
if (but.equals("RESET"))
{
Running = false;
centisec = 0;
changed = true;
}
}

private void updateReading() {

int hour,minute,second,centisecond;
long temp = centisec;
String h,m,s,c;

hour = (int) (temp / (360000));
temp = temp % 360000;
h = (hour>=10)?"":"0";

minute = (int) (temp / 6000);
temp = temp % 6000;
m = (minute>=10)?"":"0";

second = (int) (temp / 100);
temp = temp % 100;
s = (second>=10)?"":"0";

centisecond = (int) temp;
c = (centisecond>=10)?"":"0";

Reading = h+hour+':'+m+minute+':'+s+second+':'+c+centisecond;
}

public boolean isRunning() {
return Running;
}

public void incCentisec() {
centisec++;
}

public void run() {

setSize(2000,1000);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);

for(;;)
{
if(changed)
{
updateReading();
time.setText(Reading);
changed = false;
}
}
}

public void setChanged(boolean changed) {
this.changed = changed;
}
}

该线程类以 10 毫秒的间隔不断更新变量中时间的数据值(仅当“Running”设置为 true 时)。之后,它将“changed”的值更改为 true,以便另一个线程将这个新值更新到屏幕。

public class timer implements Runnable {

Interface I;
public timer(Interface i) {
super();
I = i;
}

public void run() {

for(;;) {
if (I.isRunning())
{
try {
Thread.sleep(10);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

I.incCentisec();
I.setChanged(true);
}
}
}
}

预期输出是秒表。但我的秒表对按钮没有反应。

最佳答案

尝试将 volatile 关键字添加到变量 changed

volatile boolean changed;

有时,变量会缓存在线程中,并且在被另一个线程更改时不会更新。该关键字强制在每次读取时更新值。

关于java - 为什么我的秒表程序无法运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57101163/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com