当你开启一个进程,你点击时停止这个进程。再点击时开启这个进程
public class App {
public static void main(String[] args) throws InterruptedException {
BallItem ballItem=new BallItem();
BallThread ballThread=new BallThread();
ballItem.setTwin(ballThread);
ballThread.setTwin(ballItem);
ballThread.start();
waiting();
ballItem.click();
waiting();
ballItem.click();
waiting();
ballThread.stopMe();
}
private static void waiting() throws InterruptedException {
Thread.sleep(750);
}
}
public class BallItem extends GameItem{
private boolean isSuspended;
private BallThread twin;
public void setTwin(BallThread twin) {
this.twin = twin;
}
public void move(){
System.out.println("move");
}
@Override
public void doDraw() {
System.out.println("doDraw");
}
@Override
public void click() {
isSuspended=!isSuspended;
if(isSuspended){
twin.suspendMe();
}else {
twin.resumeMe();
}
}
}
public class BallThread extends Thread {
private BallItem twin;
private volatile boolean isSuspended;
private volatile boolean isRunning=true;
public void setTwin(BallItem twin) {
this.twin = twin;
}
public void run(){
while(isRunning){
if(!isSuspended){
twin.draw();
twin.move();
}
try {
Thread.sleep(250);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public void suspendMe(){
isSuspended=true;
System.out.println("开始停止这个进程");
}
public void resumeMe(){
isSuspended=false;
System.out.println("开始恢复这个进程");
}
public void stopMe(){
this.isRunning=false;
this.isSuspended=true;
}
}
public abstract class GameItem {
public void draw(){
System.out.println("draw");
doDraw();
}
public abstract void doDraw();
public abstract void click();
}
核心思路:
volatile 关键字作用:一个线程修改了某个变量的值,这新值对其他线程来说是立即可见的。