??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲精品无码mv在线观看网站 ,国产亚洲精品看片在线观看,亚洲精品美女视频http://www.tkk7.com/endisoft/I believe I can fly,I can touch the skyzh-cnSat, 10 May 2025 16:38:48 GMTSat, 10 May 2025 16:38:48 GMT60做什么技术工资最高?http://www.tkk7.com/endisoft/archive/2006/09/29/72715.htmlEndisoftEndisoftFri, 29 Sep 2006 01:01:00 GMThttp://www.tkk7.com/endisoft/archive/2006/09/29/72715.htmlhttp://www.tkk7.com/endisoft/comments/72715.htmlhttp://www.tkk7.com/endisoft/archive/2006/09/29/72715.html#Feedback0http://www.tkk7.com/endisoft/comments/commentRss/72715.htmlhttp://www.tkk7.com/endisoft/services/trackbacks/72715.html看看indeed.com的数据:
 
1Q?strong>  做什么语a收入最高?
http://www.indeed.com/salary?q1=lisp&l1=&q2=c%2B%2B&l2=&q3=java&l3=&q4=c%23&l4=&q5=python&l5=&q6=ruby&l6=&q7=smalltalk&l7=&q8=cobol&l8=&q9=Perl&l9=&q10=Erlang&l10=&q11=Prolog&l11=&q12=C&l12=&q13=Ada&l13=&tm=1
 
每次最多比?3U语a。于是我把没有数据的Erlang换成OCamlQ军Ҏ用的Ada换成HaskellQ和不知道中国有谁用的Prolog换成AssemblyQ把C换成Visual Basic, 把Cobol换成Delphi:
http://www.indeed.com/salary?q1=lisp&l1=&q2=c%2B%2B&l2=&q3=java&l3=&q4=c%23&l4=&q5=python&l5=&q6=ruby&l6=&q7=smalltalk&l7=&q8=Delphi&l8=&q9=Perl&l9=&q10=OCaml&l10=&q11=Assembly&l11=&q12=Visual+Basic&l12=&q13=Haskell&l13=&tm=1
 
OCaml和Haskell很惨哈?/div>
 
Web开发呢Q?a >http://www.indeed.com/salary?q1=php&l1=&q2=ruby+on+rails&l2=&q3=javascript&l3=&q4=xhtml&l4=&q5=flex&l5=&q6=openlaslo&l6=&q7=flash&l7=&q8=coldfusion&l8=&q9=jsp&l9=&q10=asp&l10=&q11=asp.net&l11=&q12=vbscript&l12=&tm=1
 
 
 
做RTOS的老大们可以笑了?/div>
 
3Q?/span> 做什么技术收入高
比较搞笑的是grid computing?0000Q?低于贫困U啊。搞q行计算的灰常牛哈。这个跟若干大公司开?位数工资误搞定CELL架构QPlayStation3用的处理器就是CellQ下的编译器的高手一致哈?/div>
 
学过l计的老大们不要怒。俺知道Q俺知道Q中|均|hI间Q标准偏差,l计分布Q曲U不对称E度QskewQ,旉片,数据重合处理Q噪x除。。。等{都没有。数据没有说服力。玩儿玩儿而已Q博君一W?/div>

 再加几个具体技术,比如SAS和Matlab。小问题Qؓ什么matlab那么牛B嗫?

个h以ؓQ很多要matlab的职位是华尔街上的quants一cȝ工作。也是_不在于你matlab玩儿得多转,而在于你数学多牛。好比用相机Q不在于你自q机的说明书多熟,而在于你Ҏp术的把握?/div>


Endisoft 2006-09-29 09:01 发表评论
]]>单态设计模?/title><link>http://www.tkk7.com/endisoft/archive/2006/09/27/72178.html</link><dc:creator>Endisoft</dc:creator><author>Endisoft</author><pubDate>Wed, 27 Sep 2006 01:11:00 GMT</pubDate><guid>http://www.tkk7.com/endisoft/archive/2006/09/27/72178.html</guid><wfw:comment>http://www.tkk7.com/endisoft/comments/72178.html</wfw:comment><comments>http://www.tkk7.com/endisoft/archive/2006/09/27/72178.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/endisoft/comments/commentRss/72178.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/endisoft/services/trackbacks/72178.html</trackback:ping><description><![CDATA[ <font size="2">设计模式之Singleton(单? </font> <p> <font size="2"> <strong>单态定?/strong>:<br />Singleton模式主要作用是保证在Java应用E序中,一个类Class只有一个实例存在?</font> </p> <p> <font size="2">在很多操作中Q比如徏立目?数据库连接都需要这L单线E操作?/font> </p> <p> <font size="2">q有, singleton能够被状态化; q样Q多个单态类在一起就可以作ؓ一个状态仓库一样向外提供服务,比如Q你要论坛中的帖子计数器Q每ơ浏览一ơ需要计敎ͼ单态类能否保持住这个计敎ͼq且能synchronize的安全自动加1Q如果你要把q个数字怹保存到数据库Q你可以在不修改单态接口的情况下方便的做到?/font> </p> <p> <font size="2">另外斚wQSingleton也能够被无状态化。提供工h质的功能,<br /><br />Singleton模式׃ؓ我们提供了这样实现的可能。用Singleton的好处还在于可以节省内存Q因为它限制了实例的个数Q有利于Java垃圾回收Qgarbage collectionQ?br /><br />我们常常看到工厂模式中类装入?class loader)中也用Singleton模式实现?因ؓ被装入的cd际也属于资源?br /></font> </p> <p> <font size="2"> <strong>如何使用?</strong> <br />一般Singleton模式通常有几UŞ?</font> </p> <table cellspacing="3" cellpadding="3" width="100%" border="0"> <tbody> <tr> <td bgcolor="#cccccc"> <p> <font size="2">public class Singleton {</font> </p> <p> <font size="2">  private Singleton(){}</font> </p> <p> <font size="2">  //在自己内部定义自׃个实例,是不是很奇怪?<br />  //注意q是private 只供内部调用</font> </p> <p> <font size="2">  private static Singleton instance = new Singleton();</font> </p> <p> <font size="2">  //q里提供了一个供外部讉K本class的静态方法,可以直接讉K  <br />  public static Singleton getInstance() {<br />    return instance;   <br />   } <br />}  </font> </p> </td> </tr> </tbody> </table> <p> <font size="2">W二UŞ?</font> </p> <table cellspacing="3" cellpadding="3" width="100%" border="0"> <tbody> <tr> <td bgcolor="#cccccc"> <font size="2">public class Singleton { </font> <p> <font size="2">  private static Singleton instance = null;<br /><br />  public static synchronized Singleton getInstance() {<br /><br />  //q个Ҏ比上面有所改进Q不用每ơ都q行生成对象Q只是第一ơ     <br />  //使用时生成实例,提高了效率!<br />  if (instance==null)<br />    instanceQnew Singleton();<br />  return instance;   } </font> </p> <p> <font size="2">}  </font> </p> </td> </tr> </tbody> </table> <p> <font size="2">使用Singleton.getInstance()可以讉K单态类?/font> </p> <p> <font size="2">上面W二中Ş式是lazy initializationQ也是说第一ơ调用时初始SingletonQ以后就不用再生成了?/font> </p> <p> <font size="2">注意到lazy initialization形式中的synchronizedQ这个synchronized很重要,如果没有synchronizedQ那么用getInstance()是有可能得到多个Singleton实例。关于lazy initialization的Singleton有很多涉及double-checked locking (DCL)的讨论,有兴者进一步研I?/font> </p> <p> <font size="2">一般认为第一UŞ式要更加安全些?br /></font> </p> <p> <font size="2"> <strong>使用Singleton注意事项</strong>Q?br />有时在某些情况下Q用Singletonq不能达到Singleton的目的,如有多个Singleton对象同时被不同的c装入器装蝲Q在EJBq样的分布式pȝ中用也要注意这U情况,因ؓEJB是跨服务器,跨JVM的?/font> </p> <p> <font size="2">我们以SUN公司的宠物店源码(Pet Store 1.3.1)的ServiceLocatorZE微分析一下:<br /><br />在Pet Store中ServiceLocator有两U,一个是EJB目录下;一个是WEB目录下,我们查这两个ServiceLocator会发现内容差不多Q都是提供EJB的查询定位服务,可是Z么要分开呢?仔细研究对这两种ServiceLocator才发现区别:在WEB中的ServiceLocator的采取Singleton模式QServiceLocator属于资源定位Q理所当然应该使用Singleton模式。但是在EJB中,Singleton模式已经失去作用Q所以ServiceLocator才分成两U,一U面向WEB服务的,一U是面向EJB服务的?/font> </p> <p> <font size="2">Singleton模式看v来简单,使用Ҏ也很方便Q但是真正用好,是非怸ҎQ需要对Java的类 U程 内存{概忉|相当的了解?/font> </p> <p> <font size="2">MQ如果你的应用基于容器,那么Singleton模式用或者不用,可以使用相关替代技术?/font> </p> <img src ="http://www.tkk7.com/endisoft/aggbug/72178.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/endisoft/" target="_blank">Endisoft</a> 2006-09-27 09:11 <a href="http://www.tkk7.com/endisoft/archive/2006/09/27/72178.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>什么是Spring,Spring能干吗?http://www.tkk7.com/endisoft/archive/2006/09/26/72140.htmlEndisoftEndisoftTue, 26 Sep 2006 15:31:00 GMThttp://www.tkk7.com/endisoft/archive/2006/09/26/72140.htmlhttp://www.tkk7.com/endisoft/comments/72140.htmlhttp://www.tkk7.com/endisoft/archive/2006/09/26/72140.html#Feedback0http://www.tkk7.com/endisoft/comments/commentRss/72140.htmlhttp://www.tkk7.com/endisoft/services/trackbacks/72140.html单一?是一个容? 什么容?容纳什?是对?或者说bean的容?
那ؓ什么叫轻量U容器呢?相对于EJB container,使用spring不需要写W合容器规范的代?卛_器不?侵入"了你的代?

q个容器会提供你的应?E序)中用到的所有对?q对q些对象q行l一的生命周期管理和l装.在通常的开发中,我们在需要某个对象的时候只是 new MyObject(). 在Java?q样没有什么不?因ؓgc会打理好"善后"工作,是系l? 而用spring,在需要某个对象时,只要向容器请求相应的对象,spring会找到ƈ准备好这些对象ƈ提供l你.她也会打理好"善后"工作,但是是在应用U的.
另一斚w,springq会帮助你打理对象之间的依赖关系.
比如原来的做?

class A{
}
class B{
  A a ;
  public B(){ a = new A();}
}

而用spring的做?br />class A{
}
class B{
  A a;
  public B(){}
  void setA(A a){this.a=a}
  A getA(){return this.a}
}
(希望你不要单U地认ؓspring会写很多代码)
但从前一个方?你可能觉得spring只是一个对象容?从这里你应该看?spring是bean容器,因ؓspring需要你的类W合bean规范:相应于每一个成员域,都需要提供setter和getterҎ.spring要用这些方法来注入依赖关系,也就是 dependence injection, 或者inversion of control. 我个得还是di更容易理?直到现在我还是要考虑怎么d别h很好的解释ioc.控制反{(倒{),我的理解是就如同上面的两个例子里看到?依赖(控制)不在体现在代码逻辑?如第一个例?,而是在配|文仉,而在代码中我们只提供注入?也就是setter和getter).

希望我对IoC的概늚讲解能够l你一些启?
你可能要问了,Z么我要这样做?原来的做法有什么不妥的地方?没有什么不?只是两种理念而已,没有l对的好q是不好,但我q是l你我的解释--我理解的IoC的好?希望有所帮助.通常在程序设计的时?我们在需要某些功能时,会相应的去设计一些方?然后ҎOOdҎ和一成员变量l成一个类.实际?我们最l设计出的程序是:一l类的实例互怺互完成某个特定的d.
除了一些核心的业务Ҏ,以外我们q要做组装对象的工作.比如我有了一个工?里面有很多机?机器在开动时要装配相应的模具.那么在工厂的生q程? 首先我要有工?机器,模具q样三个c?然后我的"动作"?装配,开?通常的做法我们要做装?然后再去开?而用spring,我们只是专注于开?q样我们把装配q个动作抽离Z核心?生q程".当某些机器改变了装配模具?不在需要修Ҏ心业务代?q就是解??

public class Production{
  public static void main(String[] args){
    Factory factory = (Factory)BeanFactory.getBean("factory");
    factory.launchProduction();
  }
}

class Factory{
  Machine machine1,machine2;
  void launchProduction(){
     machine1.start(); machine2.start();
  }
  // setters and getters
}

class Machine{
  Tool tool;
  void start(){
  }
  // setters and getters
}

在launchProduction()Ҏ中只需要开动每台机器即?而不需要每ơ都装配机器.装配的工作交l了别h.现在只要按下start按钮.生񔞮开始了!要是原来:

void launchProduction(){
  machine1 = new MachineA();
  machine1.setTool(new ToolA());
  machine2 = new MachineB();
  machine2.setTool(new ToolB());
  machine1.start();
  machine2.start();
}

q就是工作分?是不是感觉轻松了许多?从此以后,我们都是面向构gd?而不需要过多地在代码中体现构g之间的依赖关p?

AOP
推荐你看一?lt;<effective enterprise java>>的第一?对AOP有很清晰,易懂的解?其实AOPq很艰深晦涩的概念,但是从架构角度去理解她的重要性可能不是我q样的new fish一时半会儿可以领悟到的.
我这里只是想?有些概念你要知道是怎么回事,但理解到多深,除了天赋以外更多的是l验和悟.所以不要心?--像是在自我解?
也许在不知不觉中你就使用了很多AOP的概?比如servlet里的filter,比如在写一个commandcL,l她的调用类在每ơ调用command时前后加?preProcess和postProcess...
我不惌释太?<<eej>>的解释已l?


Endisoft 2006-09-26 23:31 发表评论
]]>
Java多线E程序设计详l解?/title><link>http://www.tkk7.com/endisoft/archive/2006/09/21/71209.html</link><dc:creator>Endisoft</dc:creator><author>Endisoft</author><pubDate>Thu, 21 Sep 2006 14:46:00 GMT</pubDate><guid>http://www.tkk7.com/endisoft/archive/2006/09/21/71209.html</guid><wfw:comment>http://www.tkk7.com/endisoft/comments/71209.html</wfw:comment><comments>http://www.tkk7.com/endisoft/archive/2006/09/21/71209.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/endisoft/comments/commentRss/71209.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/endisoft/services/trackbacks/71209.html</trackback:ping><description><![CDATA[ <p>一、理解多U程</p> <p>  多线E是q样一U机Ӟ它允许在E序中ƈ发执行多个指令流Q每个指令流都称Z个线E,彼此间互相独立?/p> <p>  U程又称量q程Q它和进E一h有独立的执行控制Q由操作pȝ负责调度Q区别在于线E没有独立的存储I间Q而是和所属进E中的其它线E共享一个存储空_q得线E间的通信q较q程单?/p> <p>  多个U程的执行是q发的,也就是在逻辑上“同时”,而不是否是物理上的“同时”。如果系l只有一个CPUQ那么真正的“同时”是不可能的Q但是由于CPU的速度非常快,用户感觉不到其中的区别,因此我们也不用关心它Q只需要设惛_个线E是同时执行卛_?/p> <p>  多线E和传统的单U程在程序设计上最大的区别在于Q由于各个线E的控制彼此独立,使得各个U程之间的代码是乱序执行的,由此带来的线E调度,同步{问题,在以后探讨?/p> <p>  二、在Java中实现多U程</p> <p>  我们不妨设想Qؓ了创Z个新的线E,我们需要做些什么?很显Ӟ我们必须指明q个U程所要执行的代码Q而这是在Java中实现多U程我们所需要做的一切!</p> <p>  真是奇QJava是如何做到这一点的Q通过c!作ؓ一个完全面向对象的语言QJava提供了类java.lang.Thread来方便多U程~程Q这个类提供了大量的Ҏ来方便我们控制自q各个U程Q我们以后的讨论都将围绕q个c进行?/p> <p>  那么如何提供l?Java 我们要线E执行的代码呢?让我们来看一?Thread cRThread cL重要的方法是run()Q它为ThreadcȝҎstart()所调用Q提供我们的U程所要执行的代码。ؓ了指定我们自q代码Q只需要覆盖它Q?/p> <p>  Ҏ一Q?Thread c,覆盖Ҏ run()Q我们在创徏?Thread cȝ子类中重?run() ,加入U程所要执行的代码卛_。下面是一个例子:</p> <p>  public class MyThread extends Thread<br />  {<br />  int count= 1, number;<br />  public MyThread(int num)<br />  {<br />  number = num;<br />  System.out.println<br />  ("创徏U程 " + number);<br />  }<br />  public void run() {<br />  while(true) {<br />  System.out.println<br />  ("U程 " + number + ":计数 " + count);<br />  if(++count== 6) return;<br />  }<br />  }<br />  public static void main(String args[])<br />  {<br />  for(int i = 0;<br />  i ?5; i++) new MyThread(i+1).start();<br />  }<br />  }<br />  <br />  q种Ҏ单明了,W合大家的习惯,但是Q它也有一个很大的~点Q那是如果我们的类已经从一个类l承Q如程序必ȝ承自 Applet c)Q则无法再?Thread c,q时如果我们又不惛_立一个新的类Q应该怎么办呢Q?/p> <p>  我们不妨来探索一U新的方法:我们不创建Threadcȝ子类Q而是直接使用它,那么我们只能我们的Ҏ作ؓ参数传递给 Thread cȝ实例Q有点类似回调函数。但?Java 没有指针Q我们只能传递一个包含这个方法的cȝ实例?/p> <p>  那么如何限制q个cdd含这一Ҏ呢?当然是用接口!Q虽然抽象类也可满Q但是需要承,而我们之所以要采用q种新方法,不就是ؓ了避免承带来的限制吗?Q?/p> <p>  Java 提供了接?java.lang.Runnable 来支持这U方法?/p> <p>  Ҏ二:实现 Runnable 接口</p> <p>  Runnable接口只有一个方法run()Q我们声明自qcd现Runnable接口q提供这一ҎQ将我们的线E代码写入其中,完成了q一部分的Q务。但是Runnable接口q没有Q何对U程的支持,我们q必d建Threadcȝ实例Q这一炚w过Threadcȝ构造函?public Thread(Runnable target);来实现。下面是一个例子:</p> <p>  public class MyThread implements Runnable<br />  {<br />  int count= 1, number;<br />  public MyThread(int num)<br />  {<br />  number = num;<br />  System.out.println("创徏U程 " + number);<br />  }<br />  public void run()<br />  {<br />  while(true)<br />  {<br />  System.out.println<br />  ("U程 " + number + ":计数 " + count);<br />  if(++count== 6) return;<br />  }<br />  }<br />  public static void main(String args[])<br />  {<br />  for(int i = 0; i ?5;<br />  i++) new Thread(new MyThread(i+1)).start();<br />  }<br />  }<br />  <br />  严格地说Q创建Thread子类的实例也是可行的Q但是必L意的是,该子cdL有覆?Thread cȝ run ҎQ否则该U程执行的将是子cȝ run ҎQ而不是我们用以实现Runnable 接口的类?run ҎQ对此大家不妨试验一下?/p> <p>  使用 Runnable 接口来实现多U程使得我们能够在一个类中包Ҏ有的代码Q有利于装Q它的缺点在于,我们只能使用一套代码,若想创徏多个U程q各个U程执行不同的代码,则仍必须额外创徏c,如果q样的话Q在大多数情况下也许q不如直接用多个cd别?Thread 来得紧凑?/p> <p>  lg所qͼ两种Ҏ各有千秋Q大家可以灵z运用?/p> <p>  下面让我们一h研究一下多U程使用中的一些问题?/p> <p>  三、线E的四种状?/p> <p>  1. 新状态:U程已被创徏但尚未执行(start() 未被调用)?/p> <p>  2. 可执行状态:U程可以执行Q虽然不一定正在执行。CPU 旉随时可能被分配给该线E,从而得它执行?/p> <p>  3. M状态:正常情况?run() q回使得U程M。调?stop()?destroy() 亦有同样效果Q但是不被推荐,前者会产生异常Q后者是强制l止Q不会释N?/p> <p>  4. d状态:U程不会被分?CPU 旉Q无法执行?/p> <p>  四、线E的优先U?/p> <p>  U程的优先代表该线E的重要E度Q当有多个线E同时处于可执行状态ƈ{待获得 CPU 旉ӞU程调度pȝҎ各个U程的优先来决定给谁分?CPU 旉Q优先高的U程有更大的Z获得 CPU 旉Q优先低的U程也不是没有机会,只是Z要小一些Ş了?/p> <p>  你可以调?Thread cȝҎ getPriority() ?setPriority()来存取线E的优先U,U程的优先界于1(MIN_PRIORITY)?0(MAX_PRIORITY)之间Q缺省是5(NORM_PRIORITY)?/p> <p>  五、线E的同步</p> <p>  ׃同一q程的多个线E共享同一片存储空_在带来方便的同时Q也带来了访问冲H这个严重的问题。Java语言提供了专门机制以解决q种冲突Q有效避免了同一个数据对象被多个U程同时讉K?/p> <p>  ׃我们可以通过 private 关键字来保证数据对象只能被方法访问,所以我们只需针对Ҏ提出一套机Ӟq套机制是 synchronized 关键字,它包括两U用法:synchronized Ҏ?synchronized 块?/p> <p>  1. synchronized ҎQ通过在方法声明中加入 synchronized关键字来声明 synchronized Ҏ。如Q?/p> <p>  public synchronized void accessVal(int newVal);<br />  <br />   synchronized Ҏ控制对类成员变量的访问:每个cd例对应一把锁Q每?synchronized Ҏ都必获得调用该Ҏ的类实例的锁方能执行Q否则所属线E阻塞,Ҏ一旦执行,q占该锁,直到从该Ҏq回时才锁释放Q此后被d的线E方能获得该锁,重新q入可执行状态?/p> <p>  q种机制保了同一时刻对于每一个类实例Q其所有声明ؓ synchronized 的成员函C臛_只有一个处于可执行状态(因ؓ臛_只有一个能够获得该cd例对应的锁)Q从而有效避免了cL员变量的讉K冲突Q只要所有可能访问类成员变量的方法均被声明ؓ synchronizedQ?/p> <p>  ?Java 中,不光是类实例Q每一个类也对应一把锁Q这h们也可将cȝ静态成员函数声明ؓ synchronized Q以控制其对cȝ静态成员变量的讉K?/p> <p>  synchronized Ҏ的缺P若将一个大的方法声明ؓsynchronized 会大大影响效率Q典型地Q若线E类的方?run() 声明?synchronized Q由于在U程的整个生命期内它一直在q行Q因此将D它对本类M synchronized Ҏ的调用都永远不会成功。当然我们可以通过访问类成员变量的代码放C门的Ҏ中,其声明?synchronized Qƈ在主Ҏ中调用来解决q一问题Q但?Java 为我们提供了更好的解军_法,那就?synchronized 块?/p> <p>  2. synchronized 块:通过 synchronized关键字来声明synchronized 块。语法如下:</p> <p>  synchronized(syncObject)<br />  {<br />  //允许讉K控制的代?br />  }<br />  <br />  synchronized 块是q样一个代码块Q其中的代码必须获得对象 syncObject Q如前所qͼ可以是类实例或类Q的锁方能执行,具体机制同前所q。由于可以针对Q意代码块Q且可Q意指定上锁的对象Q故灉|性较高?/p> <p>  六、线E的d</p> <p>  Z解决对共享存储区的访问冲H,Java 引入了同步机Ӟ现在让我们来考察多个U程对共享资源的讉KQ显然同步机制已l不够了Q因为在L时刻所要求的资源不一定已l准备好了被讉KQ反q来Q同一时刻准备好了的资源也可能不止一个。ؓ了解册U情况下的访问控刉题,Java 引入了对d机制的支持?/p> <p>  d指的是暂停一个线E的执行以等待某个条件发生(如某资源qAQ,学过操作pȝ的同学对它一定已l很熟悉了。Java 提供了大量方法来支持dQ下面让我们逐一分析?/p> <p>  1. sleep() ҎQsleep() 允许指定以毫Uؓ单位的一D|间作为参敎ͼ它得线E在指定的时间内q入d状态,不能得到CPU 旉Q指定的旉一q,U程重新q入可执行状态。典型地Qsleep() 被用在等待某个资源就l的情ŞQ测试发现条件不满后,让线E阻塞一D|间后重新试Q直到条件满ؓ止?/p> <p>  2. suspend() ?resume() ҎQ两个方法配套用,suspend()使得U程q入d状态,q且不会自动恢复Q必d对应的resume() 被调用,才能使得U程重新q入可执行状态。典型地Qsuspend() ?resume() 被用在等待另一个线E生的l果的情形:试发现l果q没有生后Q让U程dQ另一个线E生了l果后,调用 resume() 使其恢复?/p> <p>  3. yield() ҎQyield() 使得U程攑ּ当前分得?CPU 旉Q但是不使线E阻塞,即线E仍处于可执行状态,随时可能再次分得 CPU 旉。调?yield() 的效果等价于调度E序认ؓ该线E已执行了够的旉从而{到另一个线E?/p> <p>  4. wait() ?notify() ҎQ两个方法配套用,wait() 使得U程q入d状态,它有两种形式Q一U允许指定以毫秒为单位的一D|间作为参敎ͼ另一U没有参敎ͼ前者当对应?notify() 被调用或者超出指定时间时U程重新q入可执行状态,后者则必须对应?notify() 被调用?/p> <p>  初看h它们?suspend() ?resume() ҎҎ有什么分别,但是事实上它们是截然不同的。区别的核心在于Q前面叙q的所有方法,d旉不会释放占用的锁Q如果占用了的话Q,而这一Ҏ法则相反?/p> <p>  上述的核心区别导致了一pd的细节上的区别?/p> <p>  首先Q前面叙q的所有方法都隶属?Thread c,但是q一对却直接隶属?Object c,也就是说Q所有对象都拥有q一Ҏ法。初看v来这十分不可思议Q但是实际上却是很自然的Q因一Ҏ法阻塞时要释攑֍用的锁,而锁是Q何对象都h的,调用L对象?wait() ҎDU程dQƈ且该对象上的锁被释放?/p> <p>  而调?L对象的notify()Ҏ则导致因调用该对象的 wait() Ҏ而阻塞的U程中随机选择的一个解除阻塞(但要{到获得锁后才真正可执行Q?/p> <p>  其次Q前面叙q的所有方法都可在M位置调用Q但是这一Ҏ法却必须?synchronized Ҏ或块中调用,理由也很单,只有在synchronized Ҏ或块中当前线E才占有锁,才有锁可以释放?/p> <p>  同样的道理,调用q一Ҏ法的对象上的锁必Mؓ当前U程所拥有Q这h有锁可以释放。因此,q一Ҏ法调用必L|在q样?synchronized Ҏ或块中,该方法或块的上锁对象是调用q一Ҏ法的对象。若不满一条gQ则E序虽然仍能~译Q但在运行时会出?IllegalMonitorStateException 异常?/p> <p>  wait() ?notify() Ҏ的上q特性决定了它们l常和synchronized Ҏ或块一起用,它们和操作pȝ的进E间通信机制作一个比较就会发现它们的怼性:synchronizedҎ或块提供了类g操作pȝ原语的功能,它们的执行不会受到多U程机制的干扎ͼ而这一Ҏ法则相当?block 和wakeup 原语Q这一Ҏ法均声明?synchronizedQ?/p> <p>  它们的结合得我们可以实现操作系l上一pd_֦的进E间通信的算法(如信号量法Q,q用于解军_U复杂的U程间通信问题。关?wait() ?notify() Ҏ最后再说明两点Q?/p> <p>  W一Q调?notify() ҎD解除d的线E是从因调用该对象的 wait() Ҏ而阻塞的U程中随机选取的,我们无法预料哪一个线E将会被选择Q所以编E时要特别小心,避免因这U不定性而生问题?/p> <p>  W二Q除?notify()Q还有一个方?notifyAll() 也可起到cM作用Q唯一的区别在于,调用 notifyAll() Ҏ把因调用该对象?wait() Ҏ而阻塞的所有线E一ơ性全部解除阻塞。当Ӟ只有获得锁的那一个线E才能进入可执行状态?/p> <p>  谈到dQ就不能不谈一谈死锁,略一分析p发现Qsuspend() Ҏ和不指定时期限?wait() Ҏ的调用都可能产生死锁。遗憄是,Java q不在语aU别上支持死锁的避免Q我们在~程中必d心地避免死锁?/p> <p>  以上我们?Java 中实现线E阻塞的各种Ҏ作了一番分析,我们重点分析?wait() ?notify()ҎQ因为它们的功能最强大Q用也最灉|Q但是这也导致了它们的效率较低,较容易出错。实际用中我们应该灉|使用各种ҎQ以便更好地辑ֈ我们的目的?/p> <p>  七、守护线E?/p> <p>  守护U程是一cȝD的U程Q它和普通线E的区别在于它ƈ不是应用E序的核心部分,当一个应用程序的所有非守护U程l止q行Ӟ即仍然有守护线E在q行Q应用程序也终止,反之Q只要有一个非守护U程在运行,应用E序׃会终止。守护线E一般被用于在后Cؓ其它U程提供服务?/p> <p>  可以通过调用Ҏ isDaemon() 来判断一个线E是否是守护U程Q也可以调用Ҏ setDaemon() 来将一个线E设为守护线E?/p> <p>  八、线E组</p> <p>  U程l是一?Java Ҏ的概念,?Java 中,U程l是cThreadGroup 的对象,每个U程都隶属于唯一一个线E组Q这个线E组在线E创建时指定q在U程的整个生命期内都不能更改?/p> <p>  你可以通过调用包含 ThreadGroup cd参数?Thread cL造函数来指定U程属的U程l,若没有指定,则线E缺省地隶属于名?system 的系l线E组?/p> <p>  ?Java 中,除了预徏的系l线E组外,所有线E组都必L式创建。在 Java 中,除系l线E组外的每个U程l又隶属于另一个线E组Q你可以在创建线E组时指定其所隶属的线E组Q若没有指定Q则~省地隶属于pȝU程l。这P所有线E组l成了一以pȝU程lؓ根的树?/p> <p>  Java 允许我们对一个线E组中的所有线E同时进行操作,比如我们可以通过调用U程l的相应Ҏ来设|其中所有线E的优先U,也可以启动或d其中的所有线E?/p> <p>  Java 的线E组机制的另一个重要作用是U程安全。线E组机制允许我们通过分组来区分有不同安全Ҏ的U程Q对不同l的U程q行不同的处理,q可以通过U程l的分层l构来支持不对等安全措施的采用?/p> <p>  Java ?ThreadGroup cL供了大量的方法来方便我们对线E组树中的每一个线E组以及U程l中的每一个线E进行操作?/p> <p>  九、ȝ</p> <p>  在本文中Q我们讲qC Java 多线E编E的Ҏ面面Q包括创建线E,以及对多个线E进行调度、管理。我们深刻认识到了多U程~程的复杂性,以及U程切换开销带来的多U程E序的低效性,q也促我们认真地思考一个问题:我们是否需要多U程Q何旉要多U程Q?/p> <p>  多线E的核心在于多个代码块ƈ发执行,本质特点在于各代码块之间的代码是乱序执行的。我们的E序是否需要多U程Q就是要看这是否也是它的内在特点?/p> <p>  假如我们的程序根本不要求多个代码块ƈ发执行,那自然不需要用多U程Q假如我们的E序虽然要求多个代码块ƈ发执行,但是却不要求乱序Q则我们完全可以用一个@环来单高效地实现Q也不需要用多U程Q只有当它完全符合多U程的特ҎQ多U程机制对线E间通信和线E管理的强大支持才能有用武之圎ͼq时使用多线E才是值得的?br /></p> <img src ="http://www.tkk7.com/endisoft/aggbug/71209.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/endisoft/" target="_blank">Endisoft</a> 2006-09-21 22:46 <a href="http://www.tkk7.com/endisoft/archive/2006/09/21/71209.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <p>лǵվܻԴȤ</p> <a href="http://www.tkk7.com/" title="亚洲av成人片在线观看">亚洲av成人片在线观看</a> <div class="friend-links"> </div> </div> </footer> վ֩ģ壺 <a href="http://bjmyhfc.com" target="_blank">޳վ߹ۿ</a>| <a href="http://diswooo.com" target="_blank">ۺͼƬС˵Ⱦþ</a>| <a href="http://1314xxx.com" target="_blank">avavavëƬ</a>| <a href="http://jiujiujingpin.com" target="_blank">Ļȫ</a>| <a href="http://yaboxxx125.com" target="_blank">鶹ɫۺվ </a>| <a href="http://bb927bb.com" target="_blank">պ߹ۿƵ</a>| <a href="http://cjfuli.com" target="_blank">޹Ʒһߵ</a>| <a href="http://igao4.com" target="_blank">߹ۿ</a>| <a href="http://bjsunic.com" target="_blank">˳ɵӰ߹ۿ</a>| <a href="http://gyjinzheng.com" target="_blank">100018ѷ˸ </a>| <a href="http://ydstbj.com" target="_blank">2020޾Ʒר</a>| <a href="http://xmllhb.com" target="_blank">97ɫ׳Ƶ</a>| <a href="http://bdyls.com" target="_blank">ɫۺ㽶</a>| <a href="http://yzxjk.com" target="_blank">޹aƷ</a>| <a href="http://173ba.com" target="_blank">eeussӰԺ</a>| <a href="http://tv787.com" target="_blank">޵Ӱһ</a>| <a href="http://wlzp88.com" target="_blank">˳Ƶۿ</a>| <a href="http://daohang123456.com" target="_blank">Ƶһ߹ۿ</a>| <a href="http://jmdehong.com" target="_blank">ww4545Ļѵַ</a>| <a href="http://lijieedu.com" target="_blank">ۺɫ7777վ777</a>| <a href="http://whdy888.com" target="_blank">ձҳվ</a>| <a href="http://sao350.com" target="_blank">Aһ</a>| <a href="http://langtuojidian.com" target="_blank">AVһϵ</a>| <a href="http://s8sb.com" target="_blank">ѸƵ</a>| <a href="http://345504.com" target="_blank">ڳ˾Ʒձ </a>| <a href="http://wulegu.com" target="_blank">avþþþòվ</a>| <a href="http://by4471.com" target="_blank">ששר2023</a>| <a href="http://yeyaweiban.com" target="_blank">޹˾þۺҰ</a>| <a href="http://zjhydouyaji.com" target="_blank">ѰvƷƵַ</a>| <a href="http://tjbdyx.com" target="_blank">avƬþ</a>| <a href="http://wwwxue1888.com" target="_blank">޳aƬӰԺ</a>| <a href="http://bj-tkld.com" target="_blank">ձɫƵ</a>| <a href="http://828556.com" target="_blank">һվ </a>| <a href="http://783944.com" target="_blank">avۺavһ</a>| <a href="http://wwwav800.com" target="_blank">ҹƷһ8050</a>| <a href="http://www-13696.com" target="_blank">þŮվ</a>| <a href="http://taoduoduo666.com" target="_blank">avӰ</a>| <a href="http://qq2071.com" target="_blank">Ʒһ߹ۿ</a>| <a href="http://saohuo7.com" target="_blank">AëƬav</a>| <a href="http://www-566846.com" target="_blank">˳վ18ֹ</a>| <a href="http://rhacu.com" target="_blank">vavavaþ</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>