??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲高清视频在线,蜜臀av国产精品久久久久,国产精品自在http://www.aygfsteel.com/syniii/category/47072.htmlzh-cnWed, 17 Nov 2010 08:02:31 GMTWed, 17 Nov 2010 08:02:31 GMT60javaU程的几个概念和Ҏ(gu)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有两种Ҏ(gu)Q用Threadcd使用Runnable接口?br /> 要注意的是ThreadcM实现了Runnable接口Q因此,从Threadcȝ承的cȝ实例也可以作为target传入q个构造方法。可通过q种Ҏ(gu)实现多个U程的资源共享?/p>

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

二、挂起和唤醒U程
一但线E开始执行runҎ(gu)Q就会一直到q个runҎ(gu)执行完成q个U程才退出。但在线E执行的q程中,可以通过两个Ҏ(gu)使线E暂时停止执行。这两个Ҏ(gu)是suspend和sleep。在使用suspend挂vU程后,可以通过resumeҎ(gu)唤醒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版本中这两个Ҏ(gu)可能被删除,所以尽量不要用这两个Ҏ(gu)来操作线E。下面的代码演示了sleep、suspend和resume三个Ҏ(gu)的用?/p>

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

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

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

执行了该Ҏ(gu)的线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()Ҏ(gu)会给其他U程q行的机会,而不考虑其他U程的优先Q因此会l较低线E一个运行的ZQyield()Ҏ(gu)只会l相同优先或者更高优先的线E一个运行的Z?
2、当U程执行?span style="color: red">sleep(long millis)Ҏ(gu)后,{到阻塞状?/span>Q参数millis指定睡眠旉Q当U程执行?span style="color: red">yield()Ҏ(gu)后,{到就l状?/span>?
3、sleep()Ҏ(gu)声明抛出InterruptedException异常Q而yield()Ҏ(gu)没有声明抛出M异常
4、sleep()Ҏ(gu)比yield()Ҏ(gu)h更好的移植?

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

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

(1).常用的waitҎ(gu)?font color="#0000ff">wait()?font color="#0000ff">wait(long timeout):
    void wait() 在其他线E调用此对象?notify() Ҏ(gu)?notifyAll() Ҏ(gu)前,D当前U程{待?
    void wait(long timeout) 在其他线E调用此对象?notify() Ҏ(gu)?notifyAll() Ҏ(gu)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 Ҏ(gu)使当前运行中的线E睡gD|_q入不可q行状态,q段旉的长短是q序设定的Q?span style="background-color: rgb(255,204,0)">yield Ҏ(gu)使当前线E让出CPU占有权,但让出的旉是不可设定的
?br />     yield()也不会释N标志?/strong>

    实际上,yield()Ҏ(gu)对应了如下操作: 先检当前是否有相同优先U的U程处于同可q行状态,如有Q则?CPU 的占有权交给此线E,否则l箋q行原来的线E。所以yield()Ҏ(gu)UCؓ“退?#8221;Q它把运行机会让l了同等优先U的其他U程?br />
    sleepҎ(gu)允许较低优先U的U程获得q行ZQ但yield()Ҏ(gu)执行Ӟ当前U程仍处在可q行状态,所以不可能让出较低优先U的U程些时获得CPU占有?/span>?在一个运行系l中Q如果较高优先的线E没有调?sleep Ҏ(gu)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()Ҏ(gu)Q此时它q不释放对象锁,只是把运行的Z让给其他的线E?
5?Synchronized声明不会被承,如果一个用synchronized修饰的方法被子类覆盖Q那么子cMq个Ҏ(gu)不在保持同步Q除非用synchronized修饰?

]]> վ֩ģ壺 ƽ| | | | | | ư| | Ϫ| | İ| ʯ| | ţ| Ͱ| | | | | ɽ| | Ϲ| | ƽ| | | | е| | | | | | Ұ| | Ƕ| ƾ| ״| | ֳ| IJ|