线程的使用—嘀嗒嘀嗒计时器

目的

编写一个精确定时的小工具

编程实现

此程序包含两个线程

  • DidaDida线程:功能是计时,当时间到了则唤醒DidaDidaWorker线程
  • DidaDidaWorker线程:当时间到了之后要干的事情

这是DidaDida类的三个抽象方法

    public abstract void didadidaRunning();
    public abstract void didadidaStop();
    public abstract void itIsTheTime();

DidaDidaWorker线程

这是一个内部类,当启动这个线程时,先将其wiat(),变成阻塞态,等待被唤醒;这个内部类的作用是到时间之后要干的事情。

    public class DidaDidaWorker implements Runnable {

        public DidaDidaWorker() {
        }

        @Override
        public void run() {
            while (goon) {
                synchronized (this) {
                    try {
                        this.wait();
                        if (goon) {
                            itIsTheTime();
                        }
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }

开始计时

创建一个DidaDidaWorker线程并将其启动(启动后是本线程是阻塞态,并没有开始执行真正的代码);再创建本类的线程,用wait()将其阻塞,当真正开始运行run()方法的代码时再将其唤醒。

    public void startDidaDida() {
        goon = true;
        worker = new DidaDidaWorker();
        Thread workerThread = new Thread(worker);
        workerThread.setPriority(Thread.MAX_PRIORITY);
        workerThread.start();
        synchronized (lock) {
            new Thread(this, "DidaDida").start();
            try {
                lock.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

本类的线程(DidaDida的线程)

将worker线程wait指定秒数,再将其唤醒,执行itIsTheTime()方法


    @Override
    public void run() {
        synchronized (lock) {
            lock.notify();
        }
        if (waitTime == 0) {
            waitTime = DEFAULT_TIME;
        }
        didadidaRunning();
        while (goon) {
            synchronized (worker) {
                try {
                    worker.wait(waitTime);
                    worker.notify();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
        didadidaStop();
    }

测试

public class DidaDidaDemo extends DidaDida {
	private volatile int count;
	private String name;

	public DidaDidaDemo(int didadidaTime, String name) {
		this.name = name;
		setClock(didadidaTime);
	}
	
	public void startDidadida() {
		count = 0;
		startDidaDida();
	}
	
	public void stopDidadida() {
		didadidaStop();
	}
	
	@Override
	public void didadidaRunning() {
		System.out.println(CurrentTime.logMessage("滴答滴答开始工作……"));
	}

	@Override
	public void didadidaStop() {
		System.out.println(CurrentTime.logMessage("滴答滴答停止工作"));
	}

	@Override
	public void itIsTheTime() {
		System.out.println(CurrentTime.logMessage("线程" + name
				+ ":第" + ++count + "次工作!"));
	}
	
}
	public static void main(String[] args) {
		DidaDidaDemo dida1 = new DidaDidaDemo(1000, "第一个");

		Scanner in = new Scanner(System.in);
		String message = "";
		while (!message.equalsIgnoreCase("x")) {
			message = in.nextLine();
			if (message.equalsIgnoreCase("st")) {
				dida1.startDidadida();
			} else if (message.equalsIgnoreCase("sp")) {
				dida1.stopDidaDida();
			}
		}
		
		in.close();
	}

运行结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值