<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>中文 &#187; octobershiner</title>
	<atom:link href="http://software.intel.com/zh-cn/blogs/author/octobershiner/feed/" rel="self" type="application/rss+xml" />
	<link>http://software.intel.com/zh-cn/blogs</link>
	<description></description>
	<lastBuildDate>Sat, 26 May 2012 06:34:24 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.3</generator>
		<item>
		<title>java多线程 sleep()和wait()的区别</title>
		<link>http://software.intel.com/zh-cn/blogs/2011/12/16/java-sleepwait/</link>
		<comments>http://software.intel.com/zh-cn/blogs/2011/12/16/java-sleepwait/#comments</comments>
		<pubDate>Fri, 16 Dec 2011 03:58:16 +0000</pubDate>
		<dc:creator>octobershiner</dc:creator>
				<category><![CDATA[高校博客大奖赛]]></category>

		<guid isPermaLink="false">http://software.intel.com/zh-cn/blogs/2011/12/16/java-sleepwait/</guid>
		<description><![CDATA[接触了一些多线程的东西，还是从java入手吧。 相信看这篇文章的朋友都已经知道进程和线程的区别，也都知道了为什么要使用多线程了。 这两个方法主要来源是，sleep用于线程控制，而wait用于线程间的通信，与wait配套的方法还有notify和notifyAll. 区别一： sleep是Thread类的方法，是线程用来 控制自身流程的，比如有一个要报时的线程，每一秒中打印出一个时间，那么我就需要在print方法前面加上一个sleep让自己每隔一秒执行一次。就像个闹钟一样。 wait是Object类的方法，用来线程间的通信，这个方法会使当前拥有该对象锁的进程等待知道其他线程调用notify方法时再醒来，不过你也可以给他指定一个时间，自动醒来。这个方法主要是用走不同线程之间的调度的。 区别二 ： 关于锁的释放 ，在这里假设大家已经知道了锁的概念及其意义。调用sleep方法不会释放锁（自己的感觉是sleep方法本来就是和锁没有关系的，因为他是一个线程用于管理自己的方法，不涉及线程通信） JDK 7 中的解释： “public static void sleep(long millis) throws InterruptedException Causes the currently executing thread to sleep (temporarily cease execution) for the specified number of milliseconds, subject to the precision and accuracy of system timers and schedulers.The thread does not lose ownership of any [...]]]></description>
			<content:encoded><![CDATA[<p>接触了一些多线程的东西，还是从java入手吧。</p>
<p>相信看这篇文章的朋友都已经知道进程和线程的区别，也都知道了为什么要使用多线程了。</p>
<p>这两个方法主要来源是，sleep用于线程控制，而wait用于线程间的通信，与wait配套的方法还有notify和notifyAll.</p>
<p>区别一：</p>
<p>sleep是Thread类的方法，是线程用来 控制自身流程的，比如有一个要报时的线程，每一秒中打印出一个时间，那么我就需要在print方法前面加上一个sleep让自己每隔一秒执行一次。就像个闹钟一样。</p>
<p>wait是Object类的方法，用来线程间的通信，这个方法会使当前拥有该对象锁的进程等待知道其他线程调用notify方法时再醒来，不过你也可以给他指定一个时间，自动醒来。这个方法主要是用走不同线程之间的调度的。</p>
<p> 区别二 ：</p>
<p>关于锁的释放 ，在这里假设大家已经知道了锁的概念及其意义。调用sleep方法不会释放锁（自己的感觉是sleep方法本来就是和锁没有关系的，因为他是一个线程用于管理自己的方法，不涉及线程通信）</p>
<p>JDK 7 中的解释：</p>
<p>“public static void sleep(long millis)</p>
<p>throws InterruptedException<br />
Causes the currently executing thread to sleep (temporarily cease execution) for the specified number of milliseconds, subject to the precision and accuracy of system timers and schedulers.The thread does not lose ownership of any monitors.</p>
<p>public final void wait() throws InterruptedException<br />
Causes the current thread to wait until another thread invokes the notify() method or the notifyAll() method for this object. In other words,  this method behaves exactly as if it simply performs the call wait(0).The current thread must own this object's monitor. The thread releases ownership of this monitor and    waits until another thread notifies threads waiting on this object's monitor to wake up either through a call to the notify method  the notifyAll method. The thread then waits until it can re-obtain ownership of the monitor and resumes execution.“<br />
      调用wait方法会释放当前线程的锁（其实线程间的通信是靠对象来管理的，所有操作一个对象的线程是这个对象通过自己的wait方法来管理的，就好像这个对象是电视机，三个人是三个线程，那么电视机的遥控器就是这个锁，假如现在A拿着遥控器，电视机调用wait方法，那么A就交出自己的遥控器，由jVM虚拟机调度，遥控器该交给谁。）【我想到一个好玩的例子：如果A拿遥控器的期间，他可以用自己的sleep每隔十分钟调一次电视台，而在他调台休息的十分钟期间，遥控器还在他的手上~】</p>
<p>区别三：</p>
<p>使用区域</p>
<p>由于wait函数的特殊意义，所以他是应该放在同步语句块中的，这样才有意义    。</p>
<p>注意：两个方法都需要抛出异常</p>
<p>个人见解：有sleep和wait的第二个区别，引起了我对Java线程机制的一个疑问，目前还没有看过JDk这方面的源码（其实看了，是木有看懂），线程的同步管理，是不是由对象在调度，如果是对象在调度，那么JDK 1.5新引入的ReentrantLock机制就比synchronized关键字更值得提倡。因为他更能反映出这么一个机制来。好多人不能理解wait和sleep的区别，我认为就是因为synchronized关键字的影响。当然自己还不懂JAVA的线程具体实现，留作疑问以后有时间继续研究吧</p>
<p>这个小专题貌似是学长学姐们经常面面试的题目，感谢他们的经验分享~</p>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/zh-cn/blogs/2011/12/16/java-sleepwait/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>设计模式学习----观察者模式（事件监听实现）</title>
		<link>http://software.intel.com/zh-cn/blogs/2011/12/16/400009402/</link>
		<comments>http://software.intel.com/zh-cn/blogs/2011/12/16/400009402/#comments</comments>
		<pubDate>Fri, 16 Dec 2011 03:57:52 +0000</pubDate>
		<dc:creator>octobershiner</dc:creator>
				<category><![CDATA[其他]]></category>
		<category><![CDATA[高校博客大奖赛]]></category>

		<guid isPermaLink="false">http://software.intel.com/zh-cn/blogs/2011/12/16/400009402/</guid>
		<description><![CDATA[今天分享一个设计模式----观察者模式，其实这种设计模式，我们早就接触过，做过GUI编程的同学肯定会知道，事件的注册监听等机制，其实这个机制的实现就是利用了观察者模式。 可能在程序中，我们需要在某些数据变化时，其他的类做出一些响应，我们总不能开一个线程，每隔一段时间就去检测数据有没有发生变化吧，那样效率很低，我们更希望那些具有变化属性的类能够主动将自己的变化推送给，希望检测这些变化的其他类。正如我们去医院排队，不能隔两分钟就去问大夫“轮到我了吗”，而是坐在那里等大夫的通知，大家都接收到一个名字信号，叫到谁谁就去~ 而观察者就是这样一种模式，大夫的名单就是被观察者，也叫做一个 主题。每一个病人就是一个观察者。因而，观察者模式也叫做 发布订阅模式（相信使用google reader的朋友更容易理解）。 下面 是一副来自维基百科的结构图 可以看出来，观察者模式，是一种一对多的关系，即多个观察者监听一个主题。 下面用一段代码给大家解释 观察者模式，通过这个例子，大家也可以看到一个缩水版的 事件监听机制的实现~我自己编写了一个交通灯的例子，应该比较形象 首先创建一个主题接口，他声明了一个被观察者应该具有的基本方法，包括添加观察者，删除观察者，通知 package observerpattern; /** * * @author liyang * 2011 08 2 * 主题的接口 定义标准的方法 */ public interface Subject { public void addListener(Listener listener); public void deleteListener(Listener listener); public void notifyListener(); } 接下来我们用一个类实现这个接口，所创建的类也就是我们具体要观察的对象了 package observerpattern; import java.util.ArrayList; /** * * @author liyang * [...]]]></description>
			<content:encoded><![CDATA[<p>     今天分享一个设计模式----观察者模式，其实这种设计模式，我们早就接触过，做过GUI编程的同学肯定会知道，事件的注册监听等机制，其实这个机制的实现就是利用了观察者模式。<br />
    可能在程序中，我们需要在某些数据变化时，其他的类做出一些响应，我们总不能开一个线程，每隔一段时间就去检测数据有没有发生变化吧，那样效率很低，我们更希望那些具有变化属性的类能够主动将自己的变化推送给，希望检测这些变化的其他类。正如我们去医院排队，不能隔两分钟就去问大夫“轮到我了吗”，而是坐在那里等大夫的通知，大家都接收到一个名字信号，叫到谁谁就去~ 而观察者就是这样一种模式，大夫的名单就是被观察者，也叫做一个 主题。每一个病人就是一个观察者。因而，观察者模式也叫做 发布订阅模式（相信使用google reader的朋友更容易理解）。<br />
    下面 是一副来自维基百科的结构图<br />
<a href="http://software.intel.com/zh-cn/blogs/wordpress/wp-content/uploads/2011/12/2011110519501760.png"><img src="http://software.intel.com/zh-cn/blogs/wordpress/wp-content/uploads/2011/12/2011110519501760-300x145.png" alt="" width="300" height="145" class="alignnone size-medium wp-image-400009403" /></a><br />
可以看出来，观察者模式，是一种一对多的关系，即多个观察者监听一个主题。<br />
  下面用一段代码给大家解释 观察者模式，通过这个例子，大家也可以看到一个缩水版的 事件监听机制的实现~我自己编写了一个交通灯的例子，应该比较形象<br />
  首先创建一个主题接口，他声明了一个被观察者应该具有的基本方法，包括添加观察者，删除观察者，通知<br />
<code>package observerpattern;  </p>
<p> /**<br />
  *<br />
  * @author liyang<br />
  * 2011 08 2<br />
  * 主题的接口 定义标准的方法<br />
 */<br />
 public interface Subject {<br />
     public void addListener(Listener listener);<br />
     public void deleteListener(Listener listener);<br />
     public void notifyListener();  </p>
<p> }</code><br />
接下来我们用一个类实现这个接口，所创建的类也就是我们具体要观察的对象了<br />
<code><br />
package observerpattern;  </p>
<p> import java.util.ArrayList;  </p>
<p> /**<br />
  *<br />
  * @author liyang<br />
  * 2011 08 2<br />
  * SE.HIT<br />
  * 实现主题的类，相当于图中的ConcretSubject A<br />
 */<br />
 public class Lights implements Subject{  </p>
<p>     private ArrayList lights;                //collection 用于保存 观察者的集合<br />
     private String whichLight;<br />
     private String currentLight = "green";   //记录当前 交通灯的状态<br />
     private int time;                        //记录交通灯持续的时间  </p>
<p>     public Lights(){<br />
         lights = new ArrayList();<br />
     }<br />
     //实现 添加一个观察者的操作<br />
     @Override<br />
     public void addListener(Listener listener){<br />
         lights.add(listener);<br />
     }<br />
     //实现删除一个观察者的操作<br />
     @Override<br />
     public void deleteListener(Listener listener){<br />
         int index = lights.indexOf(listener);<br />
         if( index != -1){<br />
             lights.remove(index);<br />
         }<br />
     }<br />
     //实现通知的机制 ，通知每一个观察者<br />
     public void notifyListener(){<br />
         int size = lights.size();<br />
         for(int i = 0; i &lt; size; i++){<br />
             Listener listener = (Listener)lights.get(i);<br />
             listener.updateSignal(whichLight,time);<br />
         }<br />
    }<br />
    //更新主题状态数据的方法<br />
     public void setLight(String whichlight,int time){<br />
         this.whichLight = whichlight;<br />
         this.time = time;<br />
         //检查状态是否发生了变化<br />
         check();<br />
         this.currentLight = whichLight;<br />
     }<br />
     //实现检查状态的函数<br />
     private void check(){<br />
         if(! this.currentLight.equals(this.whichLight)){<br />
             notifyListener();<br />
         }<br />
     }<br />
 }<br />
</code><br />
里面涉及了一些arrayList的东西，不清楚的同学可以好好了解一下arraylist，他里面有个Fail Fast机制，从中你可以学习到更为精彩的装饰器模式，在这里不多解释了，我博客中有一篇相关的总结<br />
  下面我们编写一个 观察者的接口，他声明观察者对通知做出的反应的方法<br />
<code>package observerpattern;  </p>
<p> /**<br />
  * @author liyang<br />
  * 2011 08 2<br />
  * 定义观察者接口  声明更新方法<br />
 */<br />
 public interface Listener {<br />
     public void updateSignal(String whichLight,int time);<br />
 }<br />
</code><br />
最后就是编写 观察者了，本例子中我们拥有三个观察者，分别观察红黄绿等是否被打开，然后各自做出相应的通知<br />
<code>package observerpattern;<br />
 /**<br />
  *<br />
  * @author liyang<br />
  * 2011 08 02<br />
  * SE.HIT<br />
  * 实现红色交通灯的观察者类，相当于图中国的ConcretObserver类<br />
 */<br />
 public class RedLightListener implements Listener{<br />
     @Override<br />
         //模拟接收通知，更新状态<br />
     public void updateSignal(String whichLight, int time){<br />
         if(whichLight.equals("red")){<br />
             System.out.println("红灯亮了，禁止通行");<br />
             System.out.println("持续时间： "+time);<br />
         }<br />
     }  </p>
<p> }</code></p>
<p><code>package observerpattern;<br />
 /**<br />
  *<br />
  * @author liyang<br />
  * 2011 08 02<br />
  * SE.HIT<br />
  * 实现黄色交通灯的观察者类<br />
 */<br />
 public class YellowLightListener implements Listener{<br />
     @Override<br />
         //模拟接收通知，更新状态<br />
     public void updateSignal(String whichLight,int time){<br />
         if(whichLight.equals("yellow")){<br />
             System.out.println("黄灯亮了，请稍等");<br />
             System.out.println("持续时间： "+ time);<br />
         }<br />
     }  </p>
<p> }</code></p>
<p><code>package observerpattern;  </p>
<p> /**<br />
  *<br />
  * @author liyang<br />
  * 2011 08 02<br />
  * SE.HIT<br />
  * 实现绿色交通灯的观察者类<br />
 */<br />
 public class GreenLightListener implements Listener{<br />
     @Override<br />
     //模拟接收通知，更新状态<br />
     public void updateSignal(String whichLight,int time){<br />
         if(whichLight.equals("green")){<br />
             System.out.println("绿灯亮了，请通过");<br />
             System.out.println("持续时间： "+time);<br />
         }<br />
     }  </p>
<p> }</code></p>
<p>最后就是一个演示的main了<br />
<code>package observerpattern;  </p>
<p> /**<br />
  *<br />
  * @author liyang<br />
  * 2011 08 02<br />
  * SE.HIT<br />
  * 演示设计模式---观察者模式的demo<br />
 */<br />
 public class ObserverPattern {  </p>
<p>     public static void main(String[] args) {<br />
         // TODO code application logic here<br />
 //创建主题，被监听对象，通常是一个自身状态属性可变的类<br />
        Lights lights = new Lights();  </p>
<p>        //创建三个观察者实例<br />
       YellowLightListener yellow = new YellowLightListener();<br />
       GreenLightListener green = new GreenLightListener();<br />
       RedLightListener red = new RedLightListener();<br />
       //向主题注册三个观察者，监听变化<br />
       lights.addListener(green);<br />
       lights.addListener(red);<br />
       lights.addListener(yellow);<br />
       //手动的改变交通灯的状态<br />
       lights.setLight("red",30);<br />
       lights.setLight("yellow", 10);<br />
       lights.setLight("green", 20);<br />
     }<br />
 }</code><br />
 最后的输出结果为<br />
run：<br />
红灯亮了，禁止通行<br />
持续时间： 30<br />
黄灯亮了，请稍等<br />
持续时间： 10<br />
绿灯亮了，请通过<br />
持续时间： 20<br />
成功生成（总时间：0 秒）</p>
<p>这就是一个比较完整的观察者模式的例子，大家应该很熟悉，我们平时addListener的时候就是在添加 观察者的~</p>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/zh-cn/blogs/2011/12/16/400009402/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

