|
关于性爱的多线程问题研究(一)<br>发信站: The unknown SPACE (Mon Apr 21 14:13:47 2003) WWW-POST<br> <br>经过多年研究,程序员发现,人们广泛关注的性爱行为就是一个多线程问题,在这个<br>专题中,我们将讨论性爱行为优先级、同步、死锁、挂起、恢复、中止及通信问题。<br> <br>首先我们来创建两个线程<br> <br>class makelove implements Runnable {<br> Thread t;<br> makelove() {<br> //Create a new Thread of makelove<br> t = new Thread(this,"make love");<br> t.start();<br> }<br> public void run() throws<br>过程中突然阳痿Exception,女人突然来了大姨妈Exception,有人敲门Exception,电话响了<br>Exception,地震Exception {<br> try {<br> while((男人兴奋想做了||女人淫荡想做了)&&身体情况允许){<br> 前奏;<br><br><br> 开始做;<br> 结束;<br> Thread.sleep(合适时间)<br> }<br> }<br> }<br> <br> class love implements Runnable {<br> Thread t;<br> makelove() {<br> //Create a new Thread of love<br> t = new Thread(this,"love");<br> if (合适异性出现)<br> t.start();<br> }<br> public void run() throws 双方家长反对Exception,<br>前任男友/女友搅局Exception{<br> 开始耍朋友;<br> }<br> }<br> <br>首先我们来复习一下线程同步的概念,当两个或者两个的线程需要共享资源,需要某种方<br><br><br>法确定资源在某一刻仅被一个线程占用,叫同步。<br>明确的分析,性和爱并不存在绝对的同步,但是在性和爱行为发生的过程中,会产生派生<br>的枝节线程,比如做爱和睡觉,同时占用了时间这个资源,<br>所以我们就简单来分析做爱和睡觉线程的同步关系,来阐述线程同步的概念。<br> <br>在此篇中,我们要新创建一个消费时间类,定义如下:<br> <br>class usabletime {<br> void usetime (String 行为参数){<br> //此处消费时间做xx,做的对象是做爱or睡觉<br> do something;<br> String 具体行为=行为参数;<br> if (具体行为.equals("做爱")){<br> //反馈做的效果<br> 发出声音("啊,啊......");}<br> else if (具体行为.equals("睡觉")){<br> //反馈做的效果<br> 发出声音("哼,打呼噜的声音......");<br> }<br> else{<br> //两者都不是,行为怪异<br> System.out.println("你在弄充气娃娃!");<br><br><br> }<br> try {<br> Thread.sleep(合适时间);<br> }catch (家里有客人Exception){<br> 心里嘀咕:真不识相;<br> 继而愤怒:还不走,老子毛了;<br> }catch (未满足还想做Exception){<br> //重复以上操作<br> repeat do;<br> }<br> }<br>}<br> <br>此处重写makelove类,当然可以采用继承,为了形象起见,重写如下:<br>class makelove implements Runnable {<br> Thread t;<br> String 行为参数 = "做爱";<br> usabletime newusetimetodo;<br> //构造函数重载<br> public makelove(usabletime usetimetodo) {<br> //Create a new Thread of makelove<br> newusetimetodo = usetimetodo;<br><br><br> t = new Thread(this,"make love");<br> t.start();<br> }<br> //此处为添加<br> setpr(p){<br> t.setPriority(p);<br> }<br> //<br> public void run() throws<br>过程中突然阳痿Exception,女人突然来了大姨妈Exception,有人敲门Exception,电话响了<br>Exception,地震Exception {<br> try {<br> while((男人兴奋想做了||女人淫荡想做了)&&身体情况允许){<br> <br> //此处要调用以上的usabletime类的usetime()方法<br> newusetimetodo.usetime(行为参数//此处为"做爱");<br> 前奏;<br> 开始做;<br> 结束;<br> Thread.sleep(合适时间)<br> }<br> }<br><br><br> }<br> <br>睡觉类的定义:<br> <br>class sleepdeeply {<br> Thread t;<br> String 行为参数 = "睡觉";<br> usabletime newusetimetodo;<br> //构造函数<br> public sleepdeeply(usabletime usetimetodo) {<br> newusetimetodo = usetimetodo;<br> t.start();<br> }<br> public void run() throws 有人敲门Exception......{<br> //此处要调用以上的usabletime类的usetime()方法<br> newusetimetodo.usetime(行为参数//此处为睡觉");<br> }<br>}<br> <br>然后我们创建主类,onedaywhattodo<br> <br>public class onedaywhattodo {<br><br><br> public static void main(Stirng args[]){<br> //定义做爱,睡觉,消费时间类的实例<br> usabletime usetimetodo = new usabletime(usetimetodo);<br> makelove makinglove = new makelove();<br> sleepdeeply sleepingdeeply = new sleepdeeply(usetimetodo);<br> <br> try {<br> nakinglove.t.join();<br> sleepingdeeply.t.join();<br> }catch(InterruptedException){<br> System.out.println("中断原因未知");<br> }<br> System.out.println("做XX完了收工!");<br> }<br>}<br> <br>大家此时可以预料程序的输出:(以上的输出可能因操作系统和任务装载先后其他原因而<br>不同)<br>啊,哼(打呼噜的声音),啊,哼(打呼噜的声音),哼(打呼噜的声音)......<br>可想,做爱和睡觉的效果都很差!<br> <br>并不是等啊...完了,再哼......<br><br><br> <br>为什么?是因为通过sleep(),usetime()允许执行转换到另外一个线程,没有阻止两个线<br>程同时调用一个对象newusetimetodo<br>这是一种竞争,两个线程争着完成方法,导致发出的声音混乱。上面用sleep()使这种影响<br>加剧。<br>大多数情况下,竞争是混乱复杂不可预知,因为你不知道上下文转换何时会发生,所以输<br>出结果自然不好预测。<br> <br>为达到理想的做爱或者睡觉的结果,并发出理想的声音效果,必须有权的使用usabletime<br>对象。<br>也就是说在某一时刻,必须只有一个线程可以支配它,为此我们必须在usabletime类的us<br>etime方法前加上关键字synchronized<br>如下:<br>class usabletime {<br> synchronized void usetime (String 行为参数){<br> //此处消费时间做xx,做的对象是or睡觉<br> do something;<br> String 具体行为=行为参数;<br> if (具体行为.equals("做爱")){<br> //反馈做的效果<br> 发出声音("啊,啊......");}<br> else {<br><br><br> //反馈做的效果<br> 发出声音("哼,打呼噜的声音......");<br> }<br> try {<br> Thread.sleep(合适时间);<br> }catch (家里有客人Exception){<br> 心里嘀咕:真不识相;<br> 继而愤怒:还不走,老子毛了;<br> }catch (未满足还想做Exception){<br> //重复以上操作<br> repeat do;<br> }<br> }<br>}<br>但是通常情况下,假定usabletime类是第三方提供的,我们不能得知源码,我们可以用另<br>一种标志对象为同步对象的方法,如:<br>newusetimetodo.usetime(行为参数//此处为"做爱");<br>前面加上<br>sychronized (newusetimetodo);<br>表示此对象同步。<br> <br>下一篇我们讨论性和爱线程的通信问题<br><br><br> |
|