滴答滴答改良——丑九怪

编程入门 行业动态 更新时间:2024-10-15 06:13:09

滴答滴答改良——丑九怪

滴答滴答改良——丑九怪

滴答滴答改良——丑九怪

  • 基于上次的滴答滴答(定时器),这里给出改良版本,但是有回报必然有代价,这次的情况听我娓娓道来。
  • 我上次所写的定时器中有个缺点:那就是我们设定的扫描时间,要比doSomething的时间长一点,这样当下一轮notify时,才可以继续进行下一次扫描。也就是对时间有要求。
  • 以下是我的解决想法:结合代码来看,上次的滴答滴答每过一段时间,都唤醒一次,然后执行一次,所执行的都是同一个线程在跑,那么可不可以实现每次唤醒,都生成一个新的线程去跑我们的doSomething方法,我已经实现了,以下是代码。
// 这是个内部类,在被计时器唤醒之后,会创建一个新的内部类:worker
class Dida implements Runnable {public Dida() {creatNewThread();}public void creatNewThread() {new Thread(this).start();}@Overridepublic void run() {while (goon) {synchronized (lock) {try {lock.wait();} catch (InterruptedException e) {e.printStackTrace();}}new Worker();}}}

下面是内部类Worker,这个类就专门负责doSomething方法的执行

class Worker implements Runnable {public Worker() {new Thread(this).start();}@Overridepublic void run() {doSomething();}}
  • 以下是测试类以及测试结果
AnotherDida didadida = new AnotherDida() {@Overridepublic void doSomething() {for (int i = 0; i < 10000000; i++) { // 这个空循环用来延长doSomething的执行时间}System.out.println("当前时间" + System.currentTimeMillis());}			@Overridepublic void beforeDoSomething() {}@Overridepublic void afterDoSomething() {}};didadida.setDelayTime(1000); // 设定的扫描时间为1000毫秒didadida.startUp();

上面的结果已经验证了这个方法的正确性,但是这个方法也有弊端。
可以看代码,每次等等待时间一到,立刻产生一个全新的线程,这样形成的扫描就像海浪一样,层叠起来,但是当doSomething的时间很长,而扫描间隔又非常短的时候,就会出现同时存在很多线程的情况。

更多推荐

滴答滴答改良——丑九怪

本文发布于:2024-02-26 09:07:14,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1701971.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:丑九怪

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!