分类目录归档:原创

PreferenceScreen的应用

PreferenceScreen preference是偏好。首选的意思,PreferenceScreen个人翻译成 “偏好显示”,明确这个意思就好。就是说依据特点灵活的定义显示内容风格,一个屏幕能够包括多个风格,像系统自带的声音设置界面。


实现这样的显示效果事实上非常easy。仅仅须要借助PreferenceScreen类就可以。在项目资源文件里新建xml目录。在里面新建preferences.xml文件.
根元素为PreferenceScreen 代表显示一整个屏幕。内部嵌套PreferenceCategory标签,表示偏好类别,在PreferenceCategory标签内部能够随便存放复选框,输入框,列表等显示控件.可包括的控件内容在android.preference包下可查阅.xml文件编写好后。须要载入到activity中,对于偏好显示的xml载入。能够使用PreferenceActivity中的addPreferencesFromResource(),所以Activity须要继承PreferenceActivity.既然显示的屏幕中包括复选框,输入框的控件,我们必定对选择与否,输入框内容感兴趣。我们要如何获取屏幕的内容呢?
复写activity中的onPreferenceTreeClick 方法。在对屏幕显示的内容进行操作时,会触发此方法。在方法内部通过调用

  1. SharedPreferences contentPreference = preference.getSharedPreferences();
  2.      boolean checkbox_toggle = contentPreference.getBoolean("checkbox_preference"false);
  3.      String animalName = contentPreference.getString("edittext_preference""default");

就可以得到屏幕上输入的内容。与使用SharedPreference对象一样,通过key-value 的形式获取,当中key是xml控件标签中key属性相应的值.
显示效果:

相应xml文件:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <PreferenceScreen
  3.         xmlns:android="http://schemas.android.com/apk/res/android">
  4.     <PreferenceCategory
  5.             android:title="显示一排偏好">
  6.         <CheckBoxPreference
  7.                 android:key="checkbox_preference"
  8.                 android:title="开关偏好"
  9.                 android:summary="这是一个开关button" />
  10.     </PreferenceCategory>
  11.     <PreferenceCategory
  12.             android:title="基于对话框的偏好">
  13.         <EditTextPreference
  14.                 android:key="edittext_preference"
  15.                 android:title="文本输入偏好"
  16.                 android:summary="使用一个文本框对话框"
  17.                 android:dialogTitle="输入你的宠物" />
  18.         <ListPreference
  19.                 android:key="list_preference"
  20.                 android:title="列表偏好"
  21.                 android:summary="使用一个列表对话框"
  22.                 android:entries="@array/entries_list_preference"
  23.                 android:entryValues="@array/entryvalues_list_preference"
  24.                 android:dialogTitle="选择一个" />
  25.     </PreferenceCategory>
  26.     <PreferenceCategory
  27.             android:title="启动偏好">
  28.         <PreferenceScreen
  29.                 android:key="screen_preference"
  30.                 android:title="屏幕"
  31.                 android:summary="显示还有一个偏好屏幕">
  32.             <!-- You can place more preferences here that will be shown on the next screen. -->
  33.             <CheckBoxPreference
  34.                     android:key="next_screen_checkbox_preference"
  35.                     android:title="开关偏好"
  36.                     android:summary="还有一个屏幕上的偏好" />
  37.         </PreferenceScreen>
  38.         <PreferenceScreen
  39.                 android:title="意图偏好"
  40.                 android:summary="通过意图启动一个Activity">
  41.             <intent android:action="android.intent.action.VIEW"
  42.                     android:data="http://www.android.com" />
  43.         </PreferenceScreen>
  44.     </PreferenceCategory>
  45.     <PreferenceCategory
  46.             android:title="偏好属性">
  47.         <CheckBoxPreference
  48.                 android:key="parent_checkbox_preference"
  49.                 android:title="父开关"
  50.                 android:summary="这是一个父开关" />
  51.         <CheckBoxPreference
  52.                 android:key="child_checkbox_preference"
  53.                 android:dependency="parent_checkbox_preference"
  54.                 android:layout="?android:attr/preferenceLayoutChild"
  55.                 android:title="子开关"
  56.                 android:summary="这是一个子开关" />
  57.     </PreferenceCategory>
  58. </PreferenceScreen>

从锦囊妙计想到的13–运行时同用户交互动态获得指示

本文是从锦囊妙计想到的13集,主要说一下如何在运行(工作的)时候,现场同用户获取工作的进一步指示,然后提高程序的工作满意度。

一。总结一下前面程序的一些特点和缺点

前面的烙饼程序是 关羽写的一些列锦囊, 然后张飞去烙饼,其实就是去执行或者运行程序。

关羽写的一系列锦囊叫做程序,这个时候关羽仅仅是预测了未来这个程序执行时的一些可以预见的事情, 对于一些无法预测的事情还不知道如何处理, 例如突然天上巨大闪电造成厨房大停电,就没办法处理了。

因此程序是事先写好的, 考虑到将来运行时的一些情况的一个一系列的指令(锦囊)的东西。这些东西可以打包到一个超级大的麻袋中, 麻袋里面可以放非常多的小麻袋, 小麻袋里面在放小麻袋。。。 最后放锦囊等等

张飞拿到外面的这个最大的麻袋, 然后打开,然后依照这里的锦囊进行工作时, 直到工作完成, 是需要一段时间的,整个这个过程叫程序的执行或者运行。运行中的程序 可以叫做进程。

在一个执行中的程序可能存在几个执行路线, 具体的看张飞是否三头六臂了。

若是张飞3头6臂 就可能有三张饼在同时烙,因此可能有3个行进路线,也就是三个线程。  当然也可能仅仅有一个,这个情况比较复杂, 以后深入计算机就明白了。现在了解一下就好。

另外, 关羽写的程序,除了可以被张飞执行,其实可以被很多人执行, 只要这些人会认字, 有一定厨房的本事就可以了。

因此一个程序其实可以 被执行多次, 别多人执行等等。

但是, 一个写好的程序其实也有一个问题,就是这个程序是按照写程序的人的想法写的, 但是写程序的人没办法预料到程序执行时一些具体的情况。例如

张飞烙饼是参照关羽写的锦囊进行的, 那么关羽一定写了自己喜欢吃的饼的做法, 例如关羽喜欢吃葱花饼, 但是改天赵云来了,赵云爱吃馅饼,等张飞端着一盆馅饼上来, 赵云一看,好家伙都是葱花饼, 没一个馅饼。。。

如何解决!

二。给程序添加点功能,在运行时询问用户喜好

前面说了赵云喜欢吃馅饼, 关羽喜欢吃葱花饼,因此我们要想办法解决这个问题。

解决办法1, 就是关羽在写锦囊时直接写了多少个葱花饼, 多少个馅饼。。。

但是这个办法的一个问题仅仅能解决 事先知道数量的情况, 若是在来个马超, 还得重新改造程序。

解决办法2, 就是在张飞烙饼的时候, 问一句, 有喜欢馅饼的吗?要多少?

然后有人回答, 有, 要30张馅饼(真能此, 足足一个饭桶)。

如何实现第二解决方案?

看下面的锦囊

锦囊1:   开始工作

锦囊2:  准备各项设施

锦囊3: 大喊有吃馅饼的吗?

锦囊4: 听是否有回答?

锦囊5: 若是有回答有吃馅饼的就

锦囊6: 吃多少?

锦囊7: 听多少个馅饼

锦囊8:开始工作。。。

。。。。

上面的一堆锦囊应该能解决大部分的问题了!

分析一下上面的过程如下

说给别人听的, 就是输出信息给 别人, 目的获取别人的回答(有时可以仅仅输出不需要回答)

等别人的回答, 就是   输入,  是别人 告诉信息给程序, 对于张飞是 输入, 因此对于计算机程序也是输入的。

如上图, 我们了解了, 那些是 从运行程序中输出东西给外面, 通常叫做输出

另外, 那些是从运行程序外面获取东西进入程序内部的叫做输入。

说明一下:

输出:  就是计算机  给 计算机外面的人员或者设备或者东西一些东西,这个就叫做输出。

输入: 就是计算机  从 计算机外面的人、设备或者东西获取一些东西。

三。用户交互

另外, 有的时候, 我们为了获取输入, 但是必须先输出一下东西, 告诉外面的人或者事情, 我要什么东西, 然后人家才会给你 你需要的东西

计算机=》输出提示信息,提示用户输入=》等待用户输入=》用户输入=》计算机获取输入后 进行后续的工作

这个有输出同时有期待输入的, 复杂的输入和输出交织到一起的, 用户和计算机之间的输入和输出之间相互互动的一个方式, 叫做 用户交互。

什么是用户交互?

用户交互: 就是通过输出一些信息提示用户或者其他系统,然后期待其他系统对后续的工作进行一定的选择或者指示的 过程叫做用户交互。

通常交互都是发生在计算机使用者人 同计算机上 因此叫做 人机交互。

可能还有其他类型的交互, 例如机器对机器的交互,这我目前没接触到, 是否有我也不确定,抱歉。

下面说一下人机交互的类型

最传统的人机交互是, 程序在计算机屏幕上输出一下提示文字,例如“请输入您的名字”, “请输入您的年龄”,“请输入您要吃的饼数”等等, 这些文字信息(计算机里面通常叫做文本信息),然后人要阅读这些信息, 然后做出选择,这个采用文本方式进行的人机交互过程通常 叫做 字符界面的人机交互过程, 通常简称cui(c是字符的意思, u用户的意思, i接口的意思)。

现在都是窗口时代了, 人们发现字符方式的交互不直观, 当文字少时还可以, 文字多了人很难理解了, 例如“某人在xxx大街东面的南方50条胡同的东侧茶楼的后面房子里面等待。。。”, 要把这个事情说清楚够费劲的, 看的人也费劲,不如画一张地图, 一看就知道了,一幕了然。

因此现在都通常采用一张合适的图片或者图表(通常放到窗口(window)里面), 然后配合一些按钮,文字, 图标等等,然后用户一下子就明白了,然后进行选择,这个图形方式为主的 同用户交互的系统叫做 图形用户交互系统, 简称 gui (g图形, u用户, i接口)

 四。输入输出设备

计算机要输出东西给外面, 外面要输入东西给计算机都需要一些具体的设施才行。

例如,计算机要显示信息给外面通常需要  显示器, 包括液晶的显示器, crt的显示器, 手机的显示屏都是显示设备。

当然有些显示设备 同时具有输入效果,例如智能手机的屏(其实就是高级的触摸屏),有些高级显示器是触摸屏, 例如火车站取票那个电脑显示屏, atm取款机那个显示屏, 这些屏 即是 显示设备也是输入设备。

再有的输出设备是  打印机, 可以把文档打印出来, 喇叭可以播放声音, 音箱可以播放声音。

输入设备,是计算机 从外界获取信息的设施手段, 通常包括键盘, 鼠标, 录音设备(手机的录音设备,说出些信息, 例如微信里面语音信息, 地图里面语音识别地名等)。还有画画的手绘板, 带压感的那种。笔记本的触摸板等等, 有很多, 这些一个共同点就是 把要求,信息,数据传输给 计算机(准确是计算机里面的一个具体的程序)

输入输出设备, 有一类特殊设备既可以是输入设备,也可以是输出设备, 例如上面提到的手机屏, 触摸屏等等,

还有硬盘也是输入输出设备, 因为你可以保持数据到硬盘这个过程是输出, 也可以从硬盘中读取数据这个是输入。

光盘也可以是输入输出设备, 刻录光盘上输出, 读取光盘是输出。

网卡也是输入输出设备, 从网络上读取数据(需要网卡的协助)是输入, 写数据到网络上是输出。

等等还有好多。

好了, 就到这里, 下一次  说说 窗口系统, activity等

 

相关文章

计算机介绍                                  从锦囊妙计想到的01

流程图(分支结构)介绍          从锦囊妙计想到的02

线程介绍                                     从锦囊妙计想到的03

循环结构介绍                             从锦囊妙计想到的05

流程线程总结                             从锦囊妙计想到的06

cpu和线程定义、开始               从锦囊妙计想到的07

分布式计算                                  从锦囊妙计想到的08

分布式中事件和计数                 从锦囊妙计想到的09

内容总结                                     从锦囊妙计想到的10

数据类型,变量简介                从锦囊妙计想到的11

函数和参数                                从锦囊妙计想到的12

用户交互与数据输入输出       从锦囊妙计想到的13

人机交互界面                            从锦囊妙计想到的15 

过程与对象                                从锦囊妙计想到的16

同步和异步                                从锦囊妙计想到的17

顺序打印                                    从锦囊妙计想到的18

数据输入输出                            从锦囊妙计想到的19

屏幕坐标和打印                        从锦囊妙计想到的20

java函数控制输出                     从锦囊妙计想到的21

逐步细化解决复杂问题           从锦囊妙计想到的22

java入门                                    从锦囊妙计想到的23

java复杂过程分析                   从锦囊妙计想到的25

中间辅助功能解决问题          从锦囊妙计想到的26

叠加操作输出复杂图形          从锦囊妙计想到的27

时间和空间                               从锦囊妙计想到的28

编写边测解决问题                  从锦囊妙计想到的29

让程序动起来                          从锦囊妙计想到的30

程序往复运动                           从锦囊妙计想到的31

从锦囊妙计想到的10–内容总结

内容回顾与总结

本文已经是这个文章系列的第9个文章了(中间跳过一个编号),

前面8个文章中, 通过比喻或者类比的办法了解到, 其实计算机就是一个执行指令(类似于古代的锦囊)的机器, 这些指令是程序员自己在程序运行前, 根据需要进行编制的。

然后, 后面7,8,9开始介绍一些分布式下的程序的工作情况, 到底什么是分布式的, 分布式可以类比 不在一个工作地点的不同人们的工作来联想。说的在通俗一点, 有时候我们可以把参加工作的各个人们都集中在一个房间, 一个地点让后让他们参加一项工作。 但是这个办法并不是总是有效, 例如人太做,房间装不下了, 或者一个军营,一个地点容不下了, 因此人们就会分别 安排到不同地点中去, 这个工作人员 分布在不同地点 的工作的安排方式叫分布式。

现实生活中,有这个问题, 计算机中也有这个问题。 那么在分布式系统中, 我们首先要必须明确的几点:

1. 异地同时工作问题

各个地点的人们是  同时在工作的, 也就是  甲地张三工作时, 乙地的 王五也在工作, 当然可以采用一定的办法 可以让他们  分别工作, 例如, 甲第, 白天工作, 乙地晚上工作, 但是这个情况比较少, 因此建议 在安排工作时, 确保同时工作能 正常进行, 才能保证不会有问题, 那么如何确保呢?  后面我们会慢慢讨论的。

 

2. 同地不同人同时工作(仍然有竞争的问题)

同一个地点的不同人 他们也会, 同时执行的, 这个是很有可能的,这样就有一个问题了, 就是竞争关系, 例如甲地 张三 正在拿起餐桌上的编号1的馒头, 同时 甲地的  马趴  也拿起编号1的馒头, 这样就有问题了, 必然打起来

若是在现实生活中很好解决,大家都是朋友, 自然有一个人退让就好了, 但是我们说的计算机是个傻东西, 他只会执行你告诉他的指令, 若是你没告诉他退让的指令, 他就不会退让, 然后。。。

3. 同地不同人, 覆盖问题

同一个地点的 两个不同人 还可能存在 覆盖的问题, 例如 甲地李四 拿起书包放到1号储物柜, 然后走了, 过一会 甲地 王五走来了, 他也把他的东西放到1号储物柜中。 这个情况下现实生活中 很好解决就是 放之前看一下, 但是计算机是个傻东西, 他就会执行指令, 若是你的指令里面没有 先检查一下的 指令, 他就不检查的呀, 就直接放了, 等到  李四到一号储物柜中取东西时, 他会取走全部东西的, 或者有的时候会变质, 例如, 李四放白菜到储物柜, 然后后面王五可能  放小白兔到储物柜, 因此等李四回来拿白菜时, 哪里还有呀!!

4. 异地不同人 集中访问一个资源 竞争问题

在不同地点的不同人也存在同时使用资源的问题

例如甲地张三 购买了城里唯一宠物店的 1号狗, 那么乙地 赵武也 购买了这个城市相同宠物店的 1号狗, 那么就有了  竞争的问题。

还是 一样, 人自己能解决这个问题, 有一个人退出就好了, 但是计算机可没那么只能, 你不告诉他, 他就会 有问题

是否有办法预防, 有, 后面慢慢会说到, 目前知道有这个情况就好

5. 异地不同人 的相互覆盖问题

这个情况同  前面的同一个地点的 两个不同人的相互覆盖有一样的事情。

例如两个不同地点的两个不同人 都到一个超市去购买东西, 然后他们放东西到超市的储物柜, 这个情况就有了相互覆盖的问题。

6. 总结一下, 一个人做指令(执行锦囊) 无论你有多少指令(或者锦囊), 也无论你这些指令如何排布(锦囊排布, 无论是分支还是循环), 这个人都要一个一个指令的做, 他没办法同时执行,原因就是他是一个人,必须一个接着一个的, 因此这些 被一个一个接着执行后的 指令可以就像一条线串到一起了, 因此这个 这些指令流 就可以是一个 线程。

什么线程, 线程通俗的说 就是一个执行路线。

每个人都会有一个执行路线, 因此一个人就相当一个cpu, 就有一个路线就是个线程(目前这么认为, 后面还会在讨论, 这个需要由简单到 复杂的慢慢过渡的)。

7. 一个任务可能有 多个人在同时执行, 例如到稻田里面去收割水稻, 要很多人进行, 这个时候 就有了多个线程, 也就是多个cpu

这些集中在一个计算机上(一个地方)的共同完成一个任务的线程构成了一个进程, 首先进程必须是执行的, 另外进程可能包括多个线程, 至少一个线程, 否则他就没有任何功能了。

8.  有的时候需要多高地方一起进行才能完成一个非常巨大的任务, 例如欢喜岭这边收割水稻,同时沙岭那边也要同时收割, 这些分布在不同地点的不同进程完成共同一个任务, 这个系统就是 分布式系统了。

对于计算机来说 不同的计算机就是不同的地点。

9. 这些分布到 不同地点的不同任务 需要协调才能更好的 一起工作, 例如一起开始, 一起结束, 然后 一起去看看 文艺节目啥的, 否则, 可能有人还在工作, 有人去看节目休息了, 这样就很不公平了。

10. 这些协调需要人员传达信息的, 任何人传达信息都要走路, 需要时间, 计算机也是  即使在快的计算机传递信息也是有 时间的

11. 不同人, 包括传递信息的人, 做工作的人, 还有路上的其他的人, 都可能 造成一定的影响, 或者这些人 工作速度等不一样, 例如早上工作快, 累了就慢了, 或者吃饱了工作快, 快到饭时了, 就慢了, 因此没有理想的 人,

计算机也是一样的 就是完全相同的cpu,完全的计算机硬件, 也可能因为环境温度, 湿度,等等造成速度的变化等

因此对数量有严格限制的  程序要特别注意这个问题

12. 对于数量有严格要求的程序或者任务要采用 计数的办法进行是最好的, 对于 没有数量要求的 任务例如收割水稻, 采用事件的办法,例如开始收割, 结束收割这些都可以看作事件,或者消息

13. 由于任何人,都可能有失误, 或者生病等, 因此例如人去传递信息时, 他病了,住院了, 那么信息谁来传递?  生活中他可以指定其他人去替他, 但是计算机比较傻的, 若是一个计算机传信息个另外计算机, 若是传递过程中出现失误, 若是没有指令告诉计算机去处理这个问题, 那么计算机就不会处理的!!  因此可能造成 整个任务失败的!  要如何避免?

还有可能某个工作的人, 工作中, 越来越累, 慢慢的睡着了, 然后睡了20天(夸张点), 那么正任务 就耽误了, 如何解决这些东西

这些都是程序要考虑的事情!  都要程序员 去编写指令 来完成这些事情。

复习是学习中非常重要的事情, 详情参见 http://www.iigrowing.cn/xue_xi_qu_xian_yu_xue_xi.html

6666

22

 

上面两张图是学习同遗忘的关系, 因此本文才花了很多篇幅来复习前面学习的一些知识, 就是复习一下, 加深印象。

上面都是对过去的回顾, 我们本次内容依然分析一下分布式任务的事情

 

数量巨大的独立工作

前面讨论的分布式烙饼中一个特点是, 很多人一起烙饼, 当这些烙饼都完成了, 这个任务才算完成。

再有一个例子是, 抬木头时, 很多人共同抬一个木头才能抬的动。

两个例子有一个共同点:      他们都是一个 单一任务,   然后这个单一任务要很多人一起工作才能完成, 并且他们中每个人到要参与或者都要完成了, 这个任务才能完成。  假设这些任务中有任何人没烙饼, 或者少烙一个, 任务没完成。  抬木头中,若是有一个人突然不抬了, 可能就抬不起来, 而且会砸到其他人。

除了这个类型的 任务外, 还有别的吗?考虑下面的吃饭任务(老是吃饭有关的!)。

还是, 编个故事, 让孩子们高兴一下。看看, 能否看完故事明白道理

话说, 张飞烙饼的事迹已经在军中 传扬开了, 大家都知道张飞不光会打仗, 也会烙饼, 然后大家更是苛刻训练防备曹军在来进犯。

这一天张飞要检阅一下, 最近的练兵结果, 因此在教军场  点起1万士兵 进行检阅, 排成  各种阵势操练起来, 练来练去, 到了中午, 该吃饭了。  老张想, 今天给大家改善一下生活。 然后说大家今天累了, 大家自己去吃饭, 吃完饭下午放假半天。

这一万人, 沿着城镇的大街走起来去找饭馆去吃饭了!

1. 没有任何一个 饭馆能同时容纳1万人

2. 这些可以分开吃, 吃完各自回家就可以了!

3. 可以适当组织一下, 让他们都均匀的分散到城里各处, 这样才能快点, 否则都挤在一处饭馆, 岂不是要 等到天黑也吃不完。

简单总结一下这个 吃饭的问题

1.  每个人吃饭, 同其他人 没关系, 他吃完自然就完成了, 不需要其他人协助等等, 就是 他的任务是 独立于其他人的任务(吃饭)

2. 他们这些人中, 可以几个人一起吃, 也可以分开吃, 可以在一个地方吃, 也可以等着别人吃完后, 有地方在吃

总之 每个人吃饭是独立的, 但是就是人多。

3. 若是有个疏导的人员对他们进行 调整一下, 他们就会更有秩序的完成吃饭

可以看到这个特点是, 一个任务或者任务群 由若干个独立  子任务组成, 每个子任务不影响其他子任务。

最后这类任务, 最后需要的是  很多饭店 , 然后让这些士兵合理的分配到这些饭店去, 就解决任务。

8888

如上图, 有20个饭店, 为这一万人提供服务, 其中张飞和他的助手负责疏导工作

9999888

如上图的红色的文字描述, 这个任务的特点。

 

大型任务的分布式解决方法

有了这个我们也来讨论前面的 烙饼的分布式任务的特点, 也画张图

11111

如上图,  一个单次的任务, 这个任务要很多 厨房一起劳动才能完成。

 

两种任务的比较

两种任务的比较如下图

233333

特别注意上图中中红色箭头和绿色箭头的情况

两种类型的任务图示已经出来了, 但是在实现上完全不一样, 难度也不一样, 目前仅仅需要知道他们的区别,将来实现时还是有很多可以借用的资源的, 因此也不是就特别难的

 

最后, 总结一下最近全部的一些内容, 放到一张图中,图没最后画完, 慢慢在补充。

 

计算机01

 

 

 

相关文章

计算机介绍                                  从锦囊妙计想到的01

流程图(分支结构)介绍          从锦囊妙计想到的02

线程介绍                                     从锦囊妙计想到的03

循环结构介绍                             从锦囊妙计想到的05

流程线程总结                             从锦囊妙计想到的06

cpu和线程定义、开始               从锦囊妙计想到的07

分布式计算                                  从锦囊妙计想到的08

分布式中事件和计数                 从锦囊妙计想到的09

内容总结                                     从锦囊妙计想到的10

数据类型,变量简介                从锦囊妙计想到的11

函数和参数                                从锦囊妙计想到的12

用户交互与数据输入输出       从锦囊妙计想到的13

人机交互界面                            从锦囊妙计想到的15 

过程与对象                                从锦囊妙计想到的16

同步和异步                                从锦囊妙计想到的17

顺序打印                                    从锦囊妙计想到的18

数据输入输出                            从锦囊妙计想到的19

屏幕坐标和打印                        从锦囊妙计想到的20

java函数控制输出                     从锦囊妙计想到的21

逐步细化解决复杂问题           从锦囊妙计想到的22

java入门                                    从锦囊妙计想到的23

java复杂过程分析                   从锦囊妙计想到的25

中间辅助功能解决问题          从锦囊妙计想到的26

叠加操作输出复杂图形          从锦囊妙计想到的27

时间和空间                               从锦囊妙计想到的28

编写边测解决问题                  从锦囊妙计想到的29

让程序动起来                          从锦囊妙计想到的30

程序往复运动                           从锦囊妙计想到的31

从锦囊妙计想到的09–分布式中事件和计数

——分布式计数任务的相关问题

前情回顾

前面一个08中通过一个厨房满足不了要求后, 然后把一个厨房完成不了的任务, 扩展到若干个厨房, 然后派人去分发命令让他们开始做事情, 然后当到达一定时间或者一定条件后, 在派人去传达命令结束任务。 最后这些分布在不同厨房的任务结果 汇总起来。但是这些结果的一个问题是, 最后的数量不够准确。

总数 = 生产的速度(或者工作速度) ×  工作时间

在写的详细点 :

总数 = 生产的速度×(结束时间t2 - 开始时间t1)

由于生产的速度, 无法一直保持稳定, 例如人们在开始工作时, 效率高, 斗争饱满, 自然快, 随着时间的推移, 累了, 烦了, 因此效率就低了。 还有另外一些因素, 例如一开始大家业务不熟悉, 但是到了后来业务逐步熟悉了, 因此可能也就快了。

但是到底, 那个因素更多, 这些因素能否相互抵消, 没办法确定, 最后可能造成数量不准确。

对于分布式系统还有如下公式

总数= 节点1总数(就是相当于厨房1) + 节点2总数(厨房2总数) + ... + 节点n总数(厨房n总数)

在详细点:

总数 = 节点1的速度 × 节点1工作时间 + 节点2速度 × 节点2工作时间 + ... + 节点n速度 × 节点n工作时间

更详细点

总数 = 节点1的速度×(节点1结束时间t12 - 节点1开始时间t11) + 节点2的速度 × (节点2的结束时间t22 - t21) + ... +

节点n的速度 × (节点n的结束时间tn2 - 节点n的开始时间tn1)

通过最后的公式我们可以看到, 每个节点速度 可能不一样, 每个节点的 开始时间, 结束时间 都可能有偏差

然后, 这些最后的偏差累计到一起, 非常可能造成最后的总数不正确。

应用场景

既然上的方法有问题, 为什么会说这个例子?  其实任何事情都有好处和缺点,因此如何应用一个东西才是问题的本质。

我们首先要了解一个方法的好处和缺点, 然后在根据需要进行判断是否满足需求。

这个开始 -- 结束这个类型的任务, 典型应用场景, 是不需要精确数量限制的地方有很多的应用, 若是有明确数量限制的 就要考虑了, 前面08中以及前面的公式都分析了这个方式  可能不准确的地方。

应用场景, 有很多, 这里准备列举一个计算机中的应用例子, 如下。

通常计算机程序都是很复杂的, 因此程序如何工作, 什么时刻,什么地点, 都做了什么, 这样当有问题 时, 就可以了解程序当时的是 如何工作的, 这样就可以排除问题。  那么上述问题需要记录下来, 否则一旦发生问题就无从查起, 因此绝大多数计算机程序都会把大量的工作情况信息等记录下来, 供以后排除问题用。 这个工作由于经常进行, 就像普通人记日记似的,  因此通常都叫做日志(更综合的一些日记吧)

由于计算机很多, 因此每个计算机都要记录自己的日志, 然后提供以后进行分析。 当日志多了的时候就需要进行一件事情, 就是把日志压缩, 或者删除一些不要的事情, 但是删除日志或者压缩是要花时间的, 并且影响计算机的正常工作, 因此这个工作都通常在晚上进行, 这个时候没人使用计算机了, 但是计算机还开着, 因此干这个事情最合适了。

因此有如下场景发生:

半夜3点, 张飞一声大喊全体计算机开始压缩(对日志的一种降低占用空间的处理办法, 压缩完毕,可以删除原文件, 压缩后的文件比原来的文件小, 这样好存储。   举个例子, 我们夏天存储羽绒服的一个办法   就是把羽绒服给抽真空, 抽完真空后 体积大的 缩小了, 占用空间小,   羽绒服在没有抽真空前(叫做原始文件), 抽完真空后叫压缩后文件), 然后传令兵, 玩命奔跑到各个厨房(就是不同的计算机),下达命令, 然后各个厨房全力进行了相关的 压缩工作。

早上5点, 张飞一看时间差不多了, 然后又大喊一声, 停止压缩了, 然后传令兵又开始奔跑了, 到了各个厨房, 通知停止压缩, 然后各个厨房停下了相关的工作。

分析:  为什么这次  可以了?   压缩日志的事情, 不需要有明确的数量, 并且是越多越好, 没明确数量, 就适合这个开始 - 结束的事情了 (其实是   事件通知类型的,以后在说)

上面是 计算机方面的 例子, 在举一个生活中的例子

一个超市, 店老板喊, 下班了, 然后各个店员就纷纷尽快结束自己手里的工作(由于店员分布在不同楼层, 不同房间)因此他们纷纷开始准备下班(一定还有一些顾客在买东西, 因此这些店员要服务完人家才能开始下班), 店主观察店中是否还有顾客存在, 当店中顾客都走了后, 店主会在喊, 开始集合, 等众人集合后, 开始总结当天工作, 以及布置第二天工作, 最后宣布下班。

这个就是开始结束的事情(其实是开始事件, 结束事件)

 

准确数量事情的改进办法

前面分析了, 这个开始结束类型工作的情况(其实是基于事件的工作), 他产生问题原因是有很多事情都是不可以进行精确控制的, 可能有时候多, 有时候少, 或者有其他情况。

但是有一个情况是一个 大家都能认可的事情, 就是, 当框苹果或者别的东西已经固定了, 然后针对这个固定的苹果框或者里面的东西进行计数(就是查数量), 这个计数的办法,无论你查的快, 慢, 等等都不会有问题, 一定是准确的, 除非查错了。 对于查错的事情, 我们可以采用两个不同人, 分别查然后核对的办法进行, 然后若是两人数量一致基本是正确的了, 同时查错的可能性比较小的, 当然可以在多些人查, 然后核对结果。

总之, 计数的办法是可以很好解决数量问题的。

因此我们对08中分布式烙饼的事情进行改进, 如下:

张飞, 通过计算发现, 每个厨房500张饼, 一共10个厨房, 这样合计就是5000张饼, 因此张飞吩咐了

传令兵去 各种的厨房 传令烙500张饼, 然后等饼都烙完了, 你们负责把饼都台回来! 交令。

然后, 各个传令兵就分别出发了, 去了各自的厨房

执行结果如下图:

a

从上图可以看出, 各个厨房完成的时间可能是不同的, 但是最终数量 一定是满足 5000张的!

 

相关文章

计算机介绍                                  从锦囊妙计想到的01

流程图(分支结构)介绍          从锦囊妙计想到的02

线程介绍                                     从锦囊妙计想到的03

循环结构介绍                             从锦囊妙计想到的05

流程线程总结                             从锦囊妙计想到的06

cpu和线程定义、开始               从锦囊妙计想到的07

分布式计算                                  从锦囊妙计想到的08

分布式中事件和计数                 从锦囊妙计想到的09

内容总结                                     从锦囊妙计想到的10

数据类型,变量简介                从锦囊妙计想到的11

函数和参数                                从锦囊妙计想到的12

用户交互与数据输入输出       从锦囊妙计想到的13

人机交互界面                            从锦囊妙计想到的15 

过程与对象                                从锦囊妙计想到的16

同步和异步                                从锦囊妙计想到的17

顺序打印                                    从锦囊妙计想到的18

数据输入输出                            从锦囊妙计想到的19

屏幕坐标和打印                        从锦囊妙计想到的20

java函数控制输出                     从锦囊妙计想到的21

逐步细化解决复杂问题           从锦囊妙计想到的22

java入门                                    从锦囊妙计想到的23

java复杂过程分析                   从锦囊妙计想到的25

中间辅助功能解决问题          从锦囊妙计想到的26

叠加操作输出复杂图形          从锦囊妙计想到的27

时间和空间                               从锦囊妙计想到的28

编写边测解决问题                  从锦囊妙计想到的29

让程序动起来                          从锦囊妙计想到的30

程序往复运动                           从锦囊妙计想到的31

从锦囊妙计想到的08–分布式计算

——分布式任务协作, 数量老是不正确的问题! 每次都不对, 谁来救救我哦!!

前情回顾

前面几回都是在烙饼, 一开始烙饼给关羽累坏了,  原因是关羽不会循环语句, 把循环用顺序结构写, 造成400张饼的锦囊要写很久, 累坏了关羽。 关羽学会了循环语句, 但是立刻把张飞累死了, 原来关羽的循环语句没有退出语句,因此张飞永远干不完(这个类型的循环是死循环), 只有关羽改进了循环,在循环中添加了判断语句若是满足了数量的要求, 就退出循环,这样张飞就不那么累了。可是问题是张飞烙饼的速度还是慢, 因此恰巧天神哪咤经过传送张飞三头六臂的办法(其实就是开多线程),这样张飞就可以在单位时间内生产出3倍数量的饼来, 可以加快时间。

出名的张飞

俗话说, 人怕出名猪怕壮, 张飞自从有三头六臂的烙饼神功后, 烙饼速度和手艺大进, 全军都已经尽人皆知了。一日,训练归来, 大家训练的很累, 大家也都知道三爷(张飞), 有烙饼的神艺, 因此纷纷说要品尝一下三爷的烙饼。张飞心想, 俺老张有神艺在身, 正好显示一下。

三爷数了数, 这些人吃饼 , 正正好5000张饼。心想看来我要大显身手了!

狭小的厨房

张飞心里算计了一下, 上次5头10臂2个小时烙饼200张, 那么1小时1个人(1个头)20张饼。

那么5000张饼, 按照这个速度烙下去就需要250个小时, 那么大家都的饿晕了。

看来6头  需要41小时

12头  20小时

...

100头 约2.5小时

老张考虑到这里心想看来 需要变为100头200条臂膀才能在2.5小时内完成烙饼任务, 说变就变。变变变。。。

结果:

jb

任何资源, 东西也好都是, 有限的, 当到一定时候就容不下了。 厨房自然有大小, 10几个人的厨房已经非常大了, 90多人, 哪里能装的下。 厨房外面自然无法烙饼了。

我们也该说道正题了, 厨房有大小, 那计算机的资源也是有大小的。 厨房一般也就是最多容纳10多人的吧,目前计算机普通的也就是相当于8个cpu,或者16个等, 都是比较正常的, 在多的, 就不常见了, 我们就不讨论了。

一个cpu就相当于一个张飞同志, 16个, 就相当于16个张飞。

张飞的妙招

张飞看了一下, 我家厨房是没这么大了, 看来, 还得在找几个厨房,然后把我老张的分身都放过去, 然后排我的传令兵去下达命令了。

如下图:

dc

如上图, 张飞同志租赁了, 若干个厨房(一共租了10个厨房), 每个厨房都有10多个张飞(图中省略一些人, 没办法画出来)。

厨房租赁好了,张飞给每个厨房分配了两个传令兵,来传达张飞的命令。

分布式烙饼

为什么叫做分布式烙饼, 主要是烙饼的工作, 分别分布在不同地点的不同厨房中, 因此叫做分布式烙饼。

计算机中,很多程序也是由分布到不同机房或者不同房间,不同机架的计算机(厨房)而共同完成一个任务, 这样的任务叫做分布式计算,或者分布式系统。

张飞说, 小的们准备好了吗(好像西游记里面老妖怪叫小妖怪)? 小妖们回答, 准备好了!

张飞说 开始烙饼, 然后各个传令兵就分别开始走向自己负责传令的厨房吩咐开始烙饼。

传令兵走后, 张飞根据 现在的厨房数量, 和每个厨房中 头数(三头六臂中,每个头都都可以独立烙饼),因此计算了一下, 2小时30分钟后烙饼就够了。

然后等一个小时25分钟后,张飞再次大喊一声,停止烙饼, 然后第二批传令兵也出发了, 分别去他们自己的厨房传达停止烙饼的命令, 然后同一次去的传令兵一起, 把每个厨房的烙饼都 抬了回来。

张飞把这些烙饼都汇总到一起, 数了数, 5332张饼。

张飞心里在想, 我明明计算好的 1小时25分钟后, 就可以烙5000张饼, 为什么多出一些??

------------------------------

这个问题非常非常重要, 为什么多出来?  为什么不是正好? 有没有可能下次在进行还是多, 或者下次用这个办法会变少?

-----------------------------

分析一下可能原因。

首先, 张飞算错了 时间,  若是发生这个情况 很可能数量不对, 当然存在多的可能。(这个情况下, 也有可能数量刚刚好的!  更深的原因我们现在不谈, 也可能存在少的可能)。

另外, 张飞若是把时间算的正确了, 就是刚刚好这些厨房都用2小时30分钟(这个就是2.5小时) 时间烙饼, 然后停止烙饼, 等等,

那么在这个情况下 是否烙饼数了就刚刚好 是 5000张呢??

其实, 无论做多多少遍,  最后大部分 都不是  5000张饼??? 为什么?

这个是非常严重的一个问题, 我们要彻底的分析出这个问题的原因, 才能解决这个问题。

(像烙饼这个, 数量不准确还可以勉强接受, 但是, 若是出售一些水果给用户, 人家用户就要5000个, 那么多采下来的卖不掉 , 就会烂掉的!!  有经济损失的!)

因此我们把 为什么数量不准的 问题要分析一下!

如下图,是 这个分布式烙饼的一个基本的 示意图

分布式烙饼时间示意图

 

如上图,  有10个厨房, 他们不在一个地点, 有可能距离很远。这里为了说明问题, 特定选择了距离较远。其实即使距离在近也存在这个问题。 相关情况我们后面会说明。

张飞在 t1的时候发布开始烙饼的命令, 然后不同厨房的传令兵开始沿着自己的最近的路线, 用最快的速度去传令。

传令

然后, 张飞在t2的时候  下达结束烙饼的命令, 然后第二批传令兵去下达停止烙饼的命令

传令2

然后各个厨房在收到 结束烙饼命令后, 就停止烙饼的工作。

在开始烙饼命令开始, 到停止烙饼命令结束直接的时间烙的饼最后汇总到一起。统计一下, 一般不会达到预期的5000个的。 为什么?

传令3

如上图, 以最后一个厨房为例, 若是前后两次传令兵  都能走出  途中  红色箭头的路线, 那么他生产出饼数才能满足5000个的要求。

但是实际最后一个传令兵会走出 蓝色箭头的  时间来, 那么这个误差就会导致 总体上的 饼的数量 同5000个不同

无论什么都需要时间

从上面分析我们可以得出:

1. 无论什么事情都需要时间,  无论你距离多么近, 无论你多么快,时间肯定是需要的。

因此传令一定需要时间, 没有办法避免的。

即使现代的计算机也是需要时间才能传递信息的。 计算机A(张飞)=》 计算机10(厨房10)传递命令, 也是需要时间的, 只是需要的少而已。

但是仍然有。

2. 无论任何人, 任何事物都难保证 沿着相同的路线运动中, 会重复前一次的所用时间的, 不同人就更难。

因此两个传令兵,沿着相同的路线到达厨房10的时间一定是不相等, 必然有早有慢

计算机也好, 人也好, 什么东西都没办法保持始终不变的速度。即使你自己能做到这一点, 也会受到来自外界的干扰, 比如路上有人找你打招呼, 比如天下雨了。。。

结论

1. 这个分布式的烙饼方案能极大的提高烙饼的速度

2. 任何事物,任何东西都会有极限,人也好, 计算机也好, 厨房也好都有极限。

当我们一个事情(烙饼)在一个有限的资源下满足不了我们(例如例子中, 一个特定厨房中), 我们就会寻求在更大的范围内进行, 然后通过一定的手段协调这些事情(例如,通过传令兵来传递命令,协调10个厨房)

3. 任何人, 任何事物, 做事情都需要时间的。

4. 任何人, 任何事物, 即使用相同的路线, 相同条件下, 也无法达到前一次的 所用的时间, 就是就是传递开始烙饼的时间, 同结束烙饼的时间一定是不同的。

更何况是不同人传令, 并且他们传令走的路线可能不同。

5. 即使传令的时间相同, 开始时间相同, 也不能保证生产出烙饼的数量刚刚好的, 因为不同人烙饼速度是不同的。

最后以上全部的因素加到一起, 决定了,上述烙饼数量上一定是 不满足要求的!!!

 

有没有  满足要求的办法, 有!!  下篇我们给出办法来。

 

相关文章

计算机介绍                                  从锦囊妙计想到的01

流程图(分支结构)介绍          从锦囊妙计想到的02

线程介绍                                     从锦囊妙计想到的03

循环结构介绍                             从锦囊妙计想到的05

流程线程总结                             从锦囊妙计想到的06

cpu和线程定义、开始               从锦囊妙计想到的07

分布式计算                                  从锦囊妙计想到的08

分布式中事件和计数                 从锦囊妙计想到的09

内容总结                                     从锦囊妙计想到的10

数据类型,变量简介                从锦囊妙计想到的11

函数和参数                                从锦囊妙计想到的12

用户交互与数据输入输出       从锦囊妙计想到的13

人机交互界面                            从锦囊妙计想到的15 

过程与对象                                从锦囊妙计想到的16

同步和异步                                从锦囊妙计想到的17

顺序打印                                    从锦囊妙计想到的18

数据输入输出                            从锦囊妙计想到的19

屏幕坐标和打印                        从锦囊妙计想到的20

java函数控制输出                     从锦囊妙计想到的21

逐步细化解决复杂问题           从锦囊妙计想到的22

java入门                                    从锦囊妙计想到的23

java复杂过程分析                   从锦囊妙计想到的25

中间辅助功能解决问题          从锦囊妙计想到的26

叠加操作输出复杂图形          从锦囊妙计想到的27

时间和空间                               从锦囊妙计想到的28

编写边测解决问题                  从锦囊妙计想到的29

让程序动起来                          从锦囊妙计想到的30

程序往复运动                           从锦囊妙计想到的31