Pho*_*pit 1 java swing multithreading
我的项目在java swing上运行,有2个按钮(开始/停止)进行计数.
当我点击开始按钮.有一个线程正在运行(Thread-0),然后单击停止按钮"Thread-0"消失,但是当我多次单击开始按钮时.有许多线程,如Thread-5,Thread-6,.. Thread-10正在运行.
问题: 如果单击开始然后停止计数就可以了.但点击开始多次计数不正确.
开始按钮
private void btnStartActionPerformed(java.awt.event.ActionEvent evt) {
start();
btnStart.setEnabled(false);
btnStop.setEnabled(true);
}
Run Code Online (Sandbox Code Playgroud)
停止按钮
private void btnStopActionPerformed(java.awt.event.ActionEvent evt) {
isEnable = false;
btnStop.setEnabled(false);
btnStart.setEnabled(true);
}
Run Code Online (Sandbox Code Playgroud)
start()方法:
isEnable = true;
Thread refreshPlan = new Thread() {
@Override
public void run() {
while(isEnable) {
try {
sleep(CYCLE_TIME * 1000);
PLAN += 1;
planValue.setText(String.valueOf(PLAN));
} catch (InterruptedException ex) {
//ignore
}
}
};
};
refreshPlan.start();
Run Code Online (Sandbox Code Playgroud)
在开始按钮中多次单击时,我可以只运行单个线程吗?有什么建议吗?谢谢.
对不起,我的英语不好.
这里有四个重要问题:
isEnable
声明为volatile变量,否则无法保证在另一个线程中可以看到来自一个线程的写入PLAN
计数器的访问(名称错误 - 请遵循Java命名约定)是不安全的.您可能希望考虑使用AtomicInteger
此功能.isEnabled
每秒只检查一个,所以可以在此期间停止并启动多个线程...导致多个线程同时处于活动状态.这可能会干扰您的计数.您可能会发现最好javax.swing.Timer
每秒使用一次触发,并检查它是否意味着做任何事情.这样一切都可以在UI线程上.
归档时间: |
|
查看次数: |
296 次 |
最近记录: |