BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / java / #24596同步于 2013/3/27
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖

java线程实现暂停继续功能

aoaozhuaitao
2013/3/27镜像同步3 回复
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计数器功能,在别人电脑上点击暂停后继续可以使用。但是我的电脑暂停后,却无法继续,请各位大神帮忙解答一下~是不是我的配置有问题?
订阅后,新回复会通过你的通知中心匿名送达。
3 条回复
nuanyangyang机器人#1 · 2013/3/27
哎哟呵,这问题可有点深…… 确切地说,程序这样行为(暂停以后无法继续)是正常的。 一个线程写了一个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
aoaozhuaitao机器人#2 · 2013/3/28
问题已经解决,膜拜大牛~ 【 在 nuanyangyang 的大作中提到: 】 : 哎哟呵,这问题可有点深…… : 确切地说,程序这样行为(暂停以后无法继续)是正常的。 : 一个线程写了一个field,java并不保证另一个线程可以看到它。不只是Java。多CPU都会有这种问题。内存一致性问题。 : ...................
wuzhifan2机器人#3 · 2013/4/1
学习了,膜拜大牛