java并发 使用ScheduledExecutor的温室控制器--thinking in java 21.7.5
- package org.rui.thread.newc;
- import java.text.DateFormat;
- import java.text.SimpleDateFormat;
- import java.util.ArrayList;
- import java.util.Calendar;
- import java.util.Collections;
- import java.util.List;
- import java.util.Random;
- import java.util.concurrent.ScheduledThreadPoolExecutor;
- import java.util.concurrent.TimeUnit;
- /**
- * 温室 控制器
- * @author lenovo
- *
- */
- public class GreenhouseScheduler
- {
- private volatile boolean light = false;// 光
- private volatile boolean water = false;// 水
- private String thermostat = "Day";// 自己主动调温器
- public synchronized String getThermostat()
- {
- return thermostat;
- }
- public synchronized void setThermostat(String thermostat)
- {
- this.thermostat = thermostat;
- }
- // 调度程序
- ScheduledThreadPoolExecutor scheduler = new ScheduledThreadPoolExecutor(10);
- /**
- *
- * @param event
- * @param delay 延迟
- */
- public void scheduler(Runnable event, long delay)
- {
- /**
- * 建并运行在给定延迟后启用的一次性操作。
- */
- scheduler.schedule(event, delay, TimeUnit.MILLISECONDS);
- }
- /**
- * 反复
- * @param envent
- * @param initialDelay
- * @param period 连续运行之间的周期 时间越少 运行的越快
- */
- public void repeat(Runnable envent, long initialDelay, long period)
- {
- /**
- * 创建并运行一个在给定初始延迟后首次启用的定期操作。兴许操作具有给定的周期。也就是将在 initialDelay
- * 后開始运行。然后在 initialDelay+period 后运行。接着在 initialDelay + 2 * period 后运行,依此类推。
- */
- scheduler.scheduleAtFixedRate(envent, initialDelay, period,
- TimeUnit.MILLISECONDS);
- }
- /**
- * inner class
- * 打开 灯
- */
- class LightOn implements Runnable
- {
- // put hardware control code here to把硬件控制代码在这里
- // physically turn on the light. 身体开灯。
- @Override
- public void run()
- {
- //System.out.println("Turning on lights");
- System.out.println("打开电灯");
- light = true;
- }
- }
- /**
- * 关
- * @author lenovo
- *
- */
- class LightOff implements Runnable
- {
- // put hardware control code here to 把硬件控制代码在这里
- // physically turn off the light. 身关灯。
- @Override
- public void run()
- {
- System.out.println("旋转 关灯 ");
- // System.out.println("Turning off light");
- water = true;
- }
- }
- class WaterOn implements Runnable
- {
- @Override
- public void run()
- {
- //System.out.println("Turning greenhouse water on");
- System.out.println("温室水开");
- water = true;
- }
- }
- class WaterOff implements Runnable
- {
- @Override
- public void run()
- {
- System.out.println("温室水关");
- //System.out.println("Turning greenhouse water off");
- water = false;
- }
- }
- /**
- * 控温器 夜晚
- * @author lenovo
- *
- */
- class ThermostatNight implements Runnable
- {
- @Override
- public void run()
- {
- // put hardware control code here 把硬件控制代码在这里
- //System.out.println("thermostat to night setting");
- System.out.println("自己主动控温器 夜晚设置");
- setThermostat("Night");
- }
- }
- /**
- * 白天
- * @author lenovo
- *
- */
- class ThernostatDay implements Runnable
- {
- @Override
- public void run()
- {
- // put hardware control code here
- System.out.println("温室白天 设置");
- // System.out.println("thermostat to day setting");
- setThermostat("Day");
- }
- }
- /**
- * 钟
- * @author lenovo
- *
- */
- class Bell implements Runnable
- {
- @Override
- public void run()
- {
- System.out.println("Bing!响铃>>");
- }
- }
- /**
- * 终止
- * @author lenovo
- *
- */
- class Terminate implements Runnable
- {
- @Override
- public void run()
- {
- System.out.println("Terminate》》结束");
- scheduler.shutdown();
- // must start a separate task to do this job 必须启动一个单独的任务来做这份工作
- // since the scheduler has been shut down 自调度器已经关闭
- new Thread()
- {
- public void run()
- {
- for (DataPoint d : data)
- {
- System.out.println("DataPoint:"+d);
- }
- };
- }.start();
- }
- }
- /**
- * 能够持有并显示单个的数据段
- * @author lenovo
- *
- */
- // inner class
- static class DataPoint
- {
- final Calendar time;
- final float temperature;
- final float humidity;
- /**
- * @param time
- * @param temperature
- * @param humidity
- */
- public DataPoint(Calendar time, float temperature, float humidity)
- {
- this.time = time;
- this.temperature = temperature;
- this.humidity = humidity;
- }
- public String toString()
- {
- DateFormat fd=new SimpleDateFormat("yyyy/MM/dd hh:mm ss");
- return fd.format(time.getTime())
- + String.format("temperature:%1$.1f humidity:%2$.2f",
- temperature, humidity);
- }
- }
- // //
- private Calendar lastTime = Calendar.getInstance();
- {
- // adjust data to the half hour 调整数据到半个小时
- lastTime.set(Calendar.MINUTE, 30);
- lastTime.set(Calendar.SECOND, 00);
- }
- private float lastTemp = 65.0f;//
- private int tempDirection = +1;//温度 方位
- private float lastHumidity = 50.0f;//最后的 湿度
- private int humidityDirection = +1;//湿气 方位
- private Random rand = new Random(47);
- List<DataPoint> data = Collections
- .synchronizedList(new ArrayList<DataPoint>());
- //被调度的任务,它在每次运行时。都能够产生仿真数据,并将其加入到Greenhouse的list<DataPoint>中
- // ineer class
- class CollectData implements Runnable
- {
- @Override
- public void run()
- {
- System.out.println("CollectData》》》run");
- synchronized (GreenhouseScheduler.this)
- {
- // pretend the interval is longer than it is: 假装间隔时间比是:
- lastTime.set(Calendar.MINUTE,
- lastTime.get(Calendar.MINUTE) + 30);
- // one in 5 chances of reversing the direction:一个在5 扭转方向的机会:
- if (rand.nextInt(5) == 4)
- {
- tempDirection = -tempDirection;// 方向
- }
- // store previous value: 店前一个值:
- lastTemp = lastTemp + tempDirection * (1.0f + rand.nextFloat());
- if (rand.nextInt(5) == 4)
- {
- humidityDirection = -humidityDirection;
- }
- lastHumidity = lastHumidity + humidityDirection
- * rand.nextFloat();
- // calendar must be cloned , otherwise all
- // dataPoints hold references to the same lastTime.
- // for a basic object like calendar,clone() is ok.
- data.add(new DataPoint((Calendar) lastTime.clone(), lastTemp,
- lastHumidity));
- }
- }
- }
- // //////////////main
- public static void main(String[] args)
- {
- GreenhouseScheduler gh = new GreenhouseScheduler();
- //延迟多少时间 关闭
- gh.scheduler(gh.new Terminate(), 5000);
- // former restart class not necessary:前重新启动类没有必要:
- gh.repeat(gh.new Bell(), 0, 1000);//响铃
- gh.repeat(gh.new ThermostatNight(), 0, 2000);//夜晚 2秒运行
- gh.repeat(gh.new LightOn(), 0, 200);//灯
- gh.repeat(gh.new LightOff(), 0, 400);
- gh.repeat(gh.new WaterOn(), 0, 600);//水
- gh.repeat(gh.new WaterOff(), 0, 800);
- //
- gh.repeat(gh.new ThernostatDay(), 0, 1400);//白天
- gh.repeat(gh.new CollectData(), 500, 500);
- }
- }
- /***
- * output:
- * Bing!响铃>>
- 自己主动控温器 夜晚设置
- 打开电灯
- 旋转 关灯
- 温室水开
- 温室水关
- 温室白天 设置
- 打开电灯
- 打开电灯
- 旋转 关灯
- CollectData》》》run
- 温室水开
- 打开电灯
- 打开电灯
- 旋转 关灯
- 温室水关
- Bing!响铃>>
- 打开电灯
- CollectData》》》run
- 打开电灯
- 温室水开
- 旋转 关灯
- 打开电灯
- 温室白天 设置
- CollectData》》》run
- 打开电灯
- 温室水关
- 旋转 关灯
- 打开电灯
- 温室水开
- Bing!响铃>>
- CollectData》》》run
- 旋转 关灯
- 打开电灯
- 自己主动控温器 夜晚设置
- 打开电灯
- 打开电灯
- 旋转 关灯
- 温室水开
- 温室水关
- CollectData》》》run
- 打开电灯
- 打开电灯
- 旋转 关灯
- 温室白天 设置
- 打开电灯
- CollectData》》》run
- 温室水开
- Bing!响铃>>
- 旋转 关灯
- 温室水关
- 打开电灯
- 打开电灯
- CollectData》》》run
- 旋转 关灯
- 温室水开
- 打开电灯
- 打开电灯
- Bing!响铃>>
- 自己主动控温器 夜晚设置
- 旋转 关灯
- 温室水关
- CollectData》》》run
- 打开电灯
- 打开电灯
- 温室水开
- 温室白天 设置
- 打开电灯
- 旋转 关灯
- CollectData》》》run
- 打开电灯
- 打开电灯
- 温室水关
- 温室水开
- 旋转 关灯
- Bing!响铃>>
- 打开电灯
- CollectData》》》run
- Terminate》》结束
- DataPoint:2015/07/19 09:00 00temperature:66.4 humidity:50.05
- DataPoint:2015/07/19 09:30 00temperature:68.0 humidity:50.47
- DataPoint:2015/07/19 10:00 00temperature:69.7 humidity:51.42
- DataPoint:2015/07/19 10:30 00temperature:70.8 humidity:50.87
- DataPoint:2015/07/19 11:00 00temperature:72.0 humidity:50.32
- DataPoint:2015/07/19 11:30 00temperature:73.2 humidity:49.92
- DataPoint:2015/07/20 12:00 00temperature:71.9 humidity:49.81
- DataPoint:2015/07/20 12:30 00temperature:70.1 humidity:50.25
- DataPoint:2015/07/20 01:00 00temperature:68.9 humidity:51.00
- DataPoint:2015/07/20 01:30 00temperature:67.7 humidity:50.21
- */
java并发 使用ScheduledExecutor的温室控制器--thinking in java 21.7.5的更多相关文章
- 《Java并发编程实战》第十六章 Java内存模型 读书笔记
Java内存模型是保障多线程安全的根基,这里不过认识型的理解总结并未深入研究. 一.什么是内存模型,为什么须要它 Java内存模型(Java Memory Model)并发相关的安全公布,同步策略的规 ...
- java 并发原子性与易变性 来自thinking in java4 21.3.3
java 并发原子性与易变性 具体介绍请參阅thinking in java4 21.3.3 thinking in java 4免费下载:http://download.csdn.net/deta ...
- java并发编程(十五)----(线程池)java线程池简介
好的软件设计不建议手动创建和销毁线程.线程的创建和销毁是非常耗 CPU 和内存的,因为这需要 JVM 和操作系统的参与.64位 JVM 默认线程栈是大小1 MB.这就是为什么说在请求频繁时为每个小的请 ...
- 【搞定 Java 并发面试】面试最常问的 Java 并发基础常见面试题总结!
本文为 SnailClimb 的原创,目前已经收录自我开源的 JavaGuide 中(61.5 k Star![Java学习+面试指南] 一份涵盖大部分Java程序员所需要掌握的核心知识.欢迎 Sta ...
- 【搞定 Java 并发面试】面试最常问的 Java 并发进阶常见面试题总结!
本文为 SnailClimb 的原创,目前已经收录自我开源的 JavaGuide 中(61.5 k Star![Java学习+面试指南] 一份涵盖大部分Java程序员所需要掌握的核心知识.觉得内容不错 ...
- Java并发编程的艺术笔记(五)——Java中的锁
一.Lock接口的几个功能: 显示的获取和释放锁 尝试非阻塞的获取锁 能被中断的获取锁 超时获取锁 使用方式: Lock lock = new ReentrantLock(); lock.lock() ...
- 《Java并发编程的艺术》第5章 Java中的锁 ——学习笔记
参考https://www.cnblogs.com/lilinzhiyu/p/8125195.html 5.1 Lock接口 锁是用来控制多个线程访问共享资源的方式. 一般来说一个锁可以防止多个线程同 ...
- 转:【Java并发编程】之十六:深入Java内存模型——happen-before规则及其对DCL的分析(含代码)
转载请注明出处:http://blog.csdn.net/ns_code/article/details/17348313 happen-before规则介绍 Java语言中有一个"先行发生 ...
- 那些年读过的书《Java并发编程实战》十、再探究Java内存模型
1.什么是内存模型,为什么需要它? (1)内存模型的发展背景 近几年计算性能通过重排序实现了很大的提升,而且处理器也越来越朝着多核处理器发展以实现硬件的并行性.随着处理器的不断强大,编译器也在不断的改 ...
随机推荐
- Error -27791: Server xx has shut down the connection prematurely
最近在进行一次性能测试中遇到一个问题,并发较大的时候会出现LR出现Error -27791: Server xx has shut down the connection prematurely的ER ...
- [codility]Equi-leader
http://codility.com/demo/take-sample-test/equileader 一开始想到从左和右两边开始扫取众数,但求众数又要重新扫一遍,这样复杂度就是O(n^2)了.此题 ...
- thinkphp 模板替换
具体详见tp手册. 如果需要修改模板替换映射路径. 则需: 'TMPL_PARSE_STRING'=>array( '__PUBLIC__'=>__ROOT__.'/'.APP_NAME. ...
- Autodesk 2014全套密钥
AUTODESK 2014通用安装序列号: 666-69696969 667-98989898 400-45454545 066-66666666 AUTODESK 2014全系列产品密钥 001F1 ...
- Android 自定义ToggleButton+用SharedPreferences保存用户配置
布局文件: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" androi ...
- VC多文档编程技巧(取消一开始时打开的空白文档)
VC多文档编程技巧(取消一开始时打开的空白文档) http://blog.csdn.net/crazyvoice/article/details/6185461 VC多文档编程技巧(取消一开始时打开的 ...
- Android 编译大全
http://quanminchaoren.iteye.com/blog/840917
- scaleform 注意事项
在使用 自带的UI .fla 里面的组建时 需要把自己建立的fla进行如下设置. 文件-发布设置-flash-脚本actionscript3.0设置——舞台:自动声明舞台实例
- MySQL 内存监控
上一篇blog介绍了因为sql查询information_schema表而导致内存暴涨的case. 今天顺便做了一个thd内存的监控: 先来介绍下MySQL的内存: 1. 线程内内存:thd-> ...
- Html——footer的使用
html部分 <div class="container"> <div class="body"></div> <di ...