问题是,每次你unblock
您正在创建线程的新实例,但您没有停止旧线程,因此它们仍在运行,更新您的 UI
public void block() {
setVisible(true);
// Create a bunch of new threads...
firstCircleThr = new FirstCircleRepaintThread();
firstCircleThr.setPriority(Thread.MAX_PRIORITY);
firstCircleThr.start();
secoundCircleThr = new SecoundCircleRepaintThread();
secoundCircleThr.setPriority(Thread.MAX_PRIORITY);
secoundCircleThr.start();
lineThr = new LineRepaintThread();
lineThr.setPriority(Thread.MAX_PRIORITY);
lineThr.start();
}
public void unblock(){
setVisible(false);
// Dereference the old ones, but they are still running...
firstCircleThr = null;
secoundCircleThr = null;
lineThr = null;
System.out.println("Yeah! OFF IT!");
}
例如...
public class FirstCircleRepaintThread extends Thread{
public static final long SPEED_OF_ROTATING = 25L;
@Override
public void run(){
//while(true){
MainCycle.frame.panel.startAngleFirst = 34;
int i = 0;
Random r = new Random();
// To infinity and beyond...
while(true){
你需要提供一些方法来停止这些线程......而不调用stop
...
例如...
public class FirstCircleRepaintThread extends Thread{
private volatile boolean keepRunning = true;
public static final long SPEED_OF_ROTATING = 25L;
public void kull() {
keepRunning = false;
interrupt();
try {
join();
} catch (InterruptedException ex) {
}
}
@Override
public void run(){
//while(true){
MainCycle.frame.panel.startAngleFirst = 34;
int i = 0;
Random r = new Random();
while(keepRunning){
现在在你身上block
方法,你应该调用firstCircleThr.kull()
,这将停止Thread
回来之前...
如果您使用调试器或在周期之间保持框架可见,您可能会看到这一点......
现在,说了这么多,您违反了 Swing 的单线程规则,从除事件调度线程之外的每个线程更新 UI 的状态。
看一眼Swing 中的并发 http://docs.oracle.com/javase/tutorial/uiswing/concurrency/并考虑使用SwingWorker http://docs.oracle.com/javase/tutorial/uiswing/concurrency/worker.html or Swing Timer http://docs.oracle.com/javase/tutorial/uiswing/misc/timer.html.
您应该考虑维护尽可能少的后台进程,以保持性能并降低更改模型和接口的复杂性