设计模式之孪生兄弟

来源:互联网 发布:linux dd命令拷贝分区 编辑:程序博客网 时间:2024/04/29 19:23

当你开启一个进程,你点击时停止这个进程。再点击时开启这个进程

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 关键字作用:一个线程修改了某个变量的值,这新值对其他线程来说是立即可见的。

原创粉丝点击