??xml version="1.0" encoding="utf-8" standalone="yes"?>欧产日产国产精品视频,亚洲mv在线,日本精品二区http://www.aygfsteel.com/syniii/category/47072.htmlzh-cnWed, 17 Nov 2010 08:02:31 GMTWed, 17 Nov 2010 08:02:31 GMT60javaU程的几个概念和Ҏhttp://www.aygfsteel.com/syniii/articles/338254.html杨罗|?/dc:creator>杨罗|?/author>Wed, 17 Nov 2010 07:08:00 GMThttp://www.aygfsteel.com/syniii/articles/338254.htmlhttp://www.aygfsteel.com/syniii/comments/338254.htmlhttp://www.aygfsteel.com/syniii/articles/338254.html#Feedback0http://www.aygfsteel.com/syniii/comments/commentRss/338254.htmlhttp://www.aygfsteel.com/syniii/services/trackbacks/338254.html

在Java中创建线E有两种ҎQ用Threadcd使用Runnable接口?br /> 要注意的是ThreadcM实现了Runnable接口Q因此,从Threadcȝ承的cȝ实例也可以作为target传入q个构造方法。可通过q种Ҏ实现多个U程的资源共享?/p>

U程的生命周期:
新徏状态:用new语句创徏的线E对象处于新建状态,此时它和其它的java对象一P仅仅在堆中被分配了内?
qA状态:当一个线E创Z以后Q其他的U程调用了它的start()ҎQ该U程p入了qA状态。处于这个状态的U程位于可运行池中,{待获得CPU的用权
q行状态:处于q个状态的U程占用CPU,执行E序的代?
d状态:当线E处于阻塞状态时Qjava虚拟Z会给U程分配CPUQ直到线E重新进入就l状态,它才有机会{到运行状态?
d状态分ZU情况:
1?位于对象{待池中的阻塞状态:当线E运行时Q如果执行了某个对象的wait()ҎQjava虚拟机就回把U程攑ֈq个对象的等待池?
2?位于对象锁中的阻塞状态,当线E处于运行状态时Q试图获得某个对象的同步锁时Q如果该对象的同步锁已经被其他的U程占用QJVM׃把这个线E放到这个对象的琐池中?
3?其它的阻塞状态:当前U程执行了sleep()ҎQ或者调用了其它U程的join()ҎQ或者发ZI/OhӞ׃q入q个状态中?br />
一、创建ƈq行U程
    当调用startҎ后,U程开始执行runҎ中的代码。线E进入运行状态。可以通过ThreadcȝisAliveҎ来判断线E是否处于运行状态。当U程处于q行状态时QisAliveq回trueQ当isAliveq回falseӞ可能U程处于{待状态,也可能处于停止状态?/p>

二、挂起和唤醒U程
一但线E开始执行runҎQ就会一直到q个runҎ执行完成q个U程才退出。但在线E执行的q程中,可以通过两个Ҏ使线E暂时停止执行。这两个Ҏ是suspend和sleep。在使用suspend挂vU程后,可以通过resumeҎ唤醒U程。而用sleep使线E休眠后Q只能在讑֮的时间后使线E处于就l状态(在线E休眠结束后Q线E不一定会马上执行Q只是进入了qA状态,{待着pȝq行调度Q?br /> 虽然suspend和resume可以很方便地使线E挂起和唤醒Q但׃使用q两个方法可能会造成一些不可预料的事情发生Q因此,q两个方法被标识为deprecated(抗议)标记Q这表明在以后的jdk版本中这两个Ҏ可能被删除,所以尽量不要用这两个Ҏ来操作线E。下面的代码演示了sleep、suspend和resume三个Ҏ的用?/p>

三、终止线E的三种Ҏ
有三U方法可以ɾl止U程?br /> 1.  使用退出标志,使线E正帔R出,也就是当runҎ完成后线E终止?br /> 2.  使用stopҎl止U程Q这个方法不推荐使用Q因为stop和suspend、resume一P也可能发生不可预料的l果Q?br /> 3.  使用interruptҎ中断U程?br />
U程的几个方法:
join()Q等待此U程M后再l箋Q可使异步线E变为同步线E?br /> interrupt()Q中断线E,被中断线E会抛InterruptedException

U程通信Qwait(),notify()   - 典型应用Q放取鸡?br /> wait() {待获取锁:

表示{待获取某个?/pre>

执行了该Ҏ的线E?span style="color: red">释放对象的锁QJVM会把该线E放?span style="color: red">对象的等待池中。该U程{待其它U程唤醒
notify() 执行该方法的U程唤醒在对象的{待池中{待的一个线E,JVM从对象的{待池中随机选择一个线E,把它转到对象的锁池中。ɾU程由阻塞队列进入就l状?br />
sleep()Q让当前正在执行的线E休眠,有一个用法可以代替yield函数——sleep(0)
yield()Q暂停当前正在执行的U程对象Qƈ执行其他U程。也是交出CPU一D|?br />
sleep和yield区别Q?br /> 1、sleep()Ҏ会给其他U程q行的机会,而不考虑其他U程的优先Q因此会l较低线E一个运行的ZQyield()Ҏ只会l相同优先或者更高优先的线E一个运行的Z?
2、当U程执行?span style="color: red">sleep(long millis)Ҏ后,{到阻塞状?/span>Q参数millis指定睡眠旉Q当U程执行?span style="color: red">yield()Ҏ后,{到就l状?/span>?
3、sleep()Ҏ声明抛出InterruptedException异常Q而yield()Ҏ没有声明抛出M异常
4、sleep()Ҏ比yield()Ҏh更好的移植?

如果希望明确地让一个线E给另外一个线E运行的ZQ可以采取以下的办法之一Q?br /> 1?调整各个U程的优先
2?让处于运行状态的U程调用Thread.sleep()Ҏ
3?让处于运行状态的U程调用Thread.yield()Ҏ
4?让处于运行状态的U程调用另一个线E的join()Ҏ

首先Q?strong style="background-color: rgb(255,204,0)">wait()和notify(),notifyAll()是ObjectcȝҎQsleep()和yield()是ThreadcȝҎ?/span>

(1).常用的waitҎ?font color="#0000ff">wait()?font color="#0000ff">wait(long timeout):
    void wait() 在其他线E调用此对象?notify() Ҏ?notifyAll() Ҏ前,D当前U程{待?
    void wait(long timeout) 在其他线E调用此对象?notify() Ҏ?notifyAll() ҎQ或者超q指定的旉量前Q导致当前线E等待?br />     wait()后,U程会释放掉它所占有?#8220;锁标?#8221;Q从而ɾU程所在对象中的其它synchronized数据可被别的U程使用?br />     wait()和notify()因ؓ会对对象?#8220;锁标?#8221;q行操作Q所以它们必dsynchronized函数或synchronized  block中进行调用。如果在non-synchronized函数或non-synchronized block中进行调用,虽然能编译通过Q但在运 行时会发生IllegalMonitorStateException的异常?br />
(2).Thread.sleep(long millis),必须带有一个时间参?/strong>?br />     sleep(long)使当前线E进入停滞状态,所以执行sleep()的线E在指定的时间内肯定不会被执行;
    sleep(long)可优先U低的线E得到执行的ZQ当然也可以让同优先U和高优先的线E有执行的机会;
    sleep(long)是不会释N标志的?br />
(3).yield()没有参数?/strong>
    sleep Ҏ使当前运行中的线E睡gD|_q入不可q行状态,q段旉的长短是q序设定的Q?span style="background-color: rgb(255,204,0)">yield Ҏ使当前线E让出CPU占有权,但让出的旉是不可设定的
?br />     yield()也不会释N标志?/strong>

    实际上,yield()Ҏ对应了如下操作: 先检当前是否有相同优先U的U程处于同可q行状态,如有Q则?CPU 的占有权交给此线E,否则l箋q行原来的线E。所以yield()ҎUCؓ“退?#8221;Q它把运行机会让l了同等优先U的其他U程?br />
    sleepҎ允许较低优先U的U程获得q行ZQ但yield()Ҏ执行Ӟ当前U程仍处在可q行状态,所以不可能让出较低优先U的U程些时获得CPU占有?/span>?在一个运行系l中Q如果较高优先的线E没有调?sleep ҎQ又没有受到 I/OdQ那么较低优先U程只能{待所有较高优先的线E运行结束,才有Zq行?br />
    yield()只是使当前线E重新回到可执行状态,所以执行yield()的线E有可能在进入到可执行状态后马上又被执行。所以yield()只能使同优先U的U程有执行的Z?/div>

volitile 语义Q?br /> volatile相当于synchronized的弱实现Q也是说volatile实现了类似synchronized的语义,却又没有锁机制。它保对volatile字段的更C可预见的方式告知其他的线E?br /> volatile包含以下语义Q?br /> Q?QJava 存储模型不会对valatile指o的操作进行重排序Q这个保证对volatile变量的操作时按照指o的出现顺序执行的?br /> Q?Qvolatile变量不会被缓存在寄存器中Q只有拥有线E可见)或者其他对CPU不可见的地方Q每ơL从主存中dvolatile变量的结果。也是说对于volatile变量的修改,其它U程L可见的,q且不是使用自己U程栈内部的变量。也是在happens-before法则中,对一个valatile变量的写操作后,其后的Q何读操作理解可见此写操作的结果?br /> 管volatile变量的特性不错,但是volatileq不能保证线E安全的Q也是说volatile字段的操作不是原子性的Qvolatile变量只能保证可见性(一个线E修改后其它U程能够理解看到此变化后的结果)Q要想保证原子性,目前为止只能加锁Q?br />
数据同步Q?br />

U程同步的特征:
1?如果一个同步代码块和非同步代码块同时操作共享资源,仍然会造成对共享资源的竞争。因为当一个线E执行一个对象的同步代码块时Q其他的U程仍然可以执行对象的非同步代码块。(所谓的U程之间保持同步Q是指不同的U程在执行同一个对象的同步代码块时Q因获得对象的同步锁而互相牵Ӟ
2?每个对象都有唯一的同步锁
3?在静态方法前面可以用synchronized修饰W?
4?当一个线E开始执行同步代码块Ӟq不意味着必须以不间断的方式运行,q入同步代码块的U程可以执行Thread.sleep()或者执行Thread.yield()ҎQ此时它q不释放对象锁,只是把运行的Z让给其他的线E?
5?Synchronized声明不会被承,如果一个用synchronized修饰的方法被子类覆盖Q那么子cMq个Ҏ不在保持同步Q除非用synchronized修饰?

]]> վ֩ģ壺 ɳ| ̫ԭ| | ͡| п| ѭ| 㶫ʡ| | | | | ͬ| ͼľ| | ½| | | | ̰| ͼ| | | | | ɽ| ӽ| ľ| | Դ| | | | | | | ʤ| | ͼľ| ͺ| | ɽ|