Java定时器的实现-------滴答滴答

今天我们来制作一个Java定时器
主要功能:使得一些需要固定间隔时间的事件能够如期执行
我们先来初步设计一下

对于要实现的事件,我们给一个接口
并且想到 对于主的线程(提供时延)以及 Timerworker线程
两个线程 通过抢占cpu 来实现定时
给一个线程 在里面进行 方法的执行 和 延时
我们分模块给出代码
git 滴答滴答 源码
构造方法:

public  Dida(long  delayTime,IDidaAction action ) {
		this.lock=new Object();
//		new 一个对象锁
		this.action=action;
		this.delayTime=delayTime;
	}

核心代码:

@Override
	public void run() {
		while(goon)
		synchronized(lock){
			try {
				lock.wait(delayTime);
//				先进行 等待  阻塞自己 将对象锁打开
				lock.notify();
//				将下面线程唤醒
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			
		}
		
	}

TimeWorker:

class TimeWorker implements Runnable{
		public void TimerWorker() {
			
		}
		@Override
		public void run() {
			while(goon) {
					try {
						synchronized(lock) {
						lock.wait();
//						先将自己阻塞  对象锁打开
//						片段没到 则进行doSomething
//						到了则运行dida线程
						}
						action.doSomething();
					} catch (InterruptedException e) {
						e.printStackTrace();
					
					}
				
				}
			}
			
		}
//	doSomething 每次的间隔时间是delayTime整数倍
//	因为 可能时间到了 但那个线程没准备好,就再进行一次等待
//	或者那个线程好了 但是 时间没到就 继续等等待时间完结



开始停止:

void start() {
		if (action == null) {
			System.out.println("无事可做!");
			return;
		}
		if (goon) {
			return;
		}
		goon = true;
		new Thread(new TimeWorker(), "TimeWork").start();
		new Thread(this, "DidaDida").start();
	}

	void  stop() {
		if (action == null) {
			System.out.println("没做任何事!");
			return;
		}
		if (goon == false) {
			System.out.println("时钟已经停止计时!");
			return;
		}
		goon = false;
	}
//	先进行TimeWorker  然后 wait() 使得阻塞起来
//	dida里面  wait  delayTime  
//	此时这两个线程都是阻塞的
//	直到  delayTime结束
//	notify  Timworker
//	从wait  下面开始执行开对象锁
//	执行 doSometing
//	并且继续执行 下一次执行
//	若是 doSomething 没执行完
//	notify  此时无用 因为  根本没有线程处于阻塞  故会再次进行计时

最后new一个Dida类
实现dosomething()方法
然后给出开始 结束方法 之间要让主线程睡眠便于输出:

public static void main(String[] args) {
		DidaDida dida = new DidaDida(50, new IDidaDidaAction() {
			@Override
			public void doSomething() {
				System.out.println("\n---------------" + System.currentTimeMillis());
				for (int i = 0; i < 10000000; i++) {
					System.out.print(i);
				}
			}
		});
		dida.start();
		try {
			Thread.sleep(50000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		dida.stop();
		System.out.println("停止!");



我们发现 这种情况下 :
当事件的执行时间比等待时间长时 我们是等待当前时间执行完才去执行下一个

于是我们就进行了改进
对于定时器里面我们当定时时间到的时候
另外开辟一个线程取执行

最后我们加上了线程池
这是改了之后的核心代码

@Override
	public void run() {
		while(goon) {
			synchronized (lock) {
				try {
					lock.wait(delayTime);
						new OtherWorker.start();
					
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
			}
		}
	
	class  OtherWorker extends  Thread{
		public  OtherWorker() {
		}
		@Override
		public void run() {
				actionWorker.doSomething();
		}
		
	}

	}
	
	
		
	
	
	
	
	

全部评论

相关推荐

昨天 13:29
已编辑
湖南铁道职业技术学院 后端
小红书 后端选手 n*16*1.18+签字费期权
点赞 评论 收藏
分享
10-09 22:05
666 C++
找到工作就狠狠玩CSGO:报联合国演讲,报电子烟设计与制造
点赞 评论 收藏
分享
hso_:哈哈哈哈哈哈我没offer一样在同一道题开喷了
投递深圳同为数码等公司10个岗位
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务