返回信息流import java.awt.event.*;
import javax.swing.*;
public class Demo extends Thread {
private JFrame frm = new JFrame("Demo");
private JButton btnPause = new JButton("Pause");
private JLabel lblTest = new JLabel("0");
private boolean isPaused = false;
private int seconds = 0;
public void run () {
while (true) {
while (isPaused);
seconds ++;
lblTest.setText("正在执行指令" +seconds + "^^");
try {
sleep(1000);
} catch (InterruptedException ie) {}
}
}
public Demo () {
frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frm.setResizable(false);
frm.setLayout(null);
frm.setSize(150, 200);
frm.setLocationRelativeTo(null);
lblTest.setBounds(20, 50, 100, 25);
btnPause.setBounds(20, 120, 100, 30);
btnPause.addActionListener(new ActionListener() {
public void actionPerformed (ActionEvent ae) {
if (isPaused) {
btnPause.setText("Pause");
isPaused = false;
} else {
btnPause.setText("Resume");
isPaused = true;
}
}
});
frm.add(lblTest);
frm.add(btnPause);
frm.setVisible(true);
start();
}
public static void main (String args[]) {
new Demo();
}
}
以上代码是我用线程实现的一个Timer计数器功能,在别人电脑上点击暂停后继续可以使用。但是我的电脑暂停后,却无法继续,请各位大神帮忙解答一下~是不是我的配置有问题?
这是一条镜像帖。来源:北邮人论坛 / java / #24596同步于 2013/3/27
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖
java线程实现暂停继续功能
aoaozhuaitao
2013/3/27镜像同步3 回复
订阅后,新回复会通过你的通知中心匿名送达。
3 条回复
哎哟呵,这问题可有点深……
确切地说,程序这样行为(暂停以后无法继续)是正常的。
一个线程写了一个field,java并不保证另一个线程可以看到它。不只是Java。多CPU都会有这种问题。内存一致性问题。
这样改貌似能解决问题:
public class Demo extends Thread {
private JFrame frm = new JFrame("Demo");
private JButton btnPause = new JButton("Pause");
private JLabel lblTest = new JLabel("0");
- private boolean isPaused = false;
+ private volatile boolean isPaused = false;
private int seconds = 0;
public void run () {
加volatile以后,对这个域的读写就视为同步读写。Java语言保证对于同步读写动作,如果某次写在某次读之前发生,而且两者之间没有间隔其它的写,那么这次读可以看到这次写写入的内容。
但对于普通读写没有任何保证。
用另一个概念说,两个线程在没有额外的同步措施的情况下,对一个field进行读写,会造成data race。这种情况下不能保证上述的读写一致性。
但是,Java提供了比while循环更好的同步机制。试试java.util.concurrent.Condition吧。http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/locks/Condition.html
问题已经解决,膜拜大牛~
【 在 nuanyangyang 的大作中提到: 】
: 哎哟呵,这问题可有点深……
: 确切地说,程序这样行为(暂停以后无法继续)是正常的。
: 一个线程写了一个field,java并不保证另一个线程可以看到它。不只是Java。多CPU都会有这种问题。内存一致性问题。
: ...................