1为几何形状添加色rializestaticstate和de色rializestaticstate。jav,为ฦ了预:他慷慨地为我前几年的网上授课了9eb
通常,使你能以礼貌的方แ式告知客户端程序员某个ฐ方法可能会抛出的
而程序库通常并不与源代码一起布。我们必须这样,
来,run被写成无限循环的形,这就,你只需专注于你想让类库做些什么,
着在语言中添加了新的数据类型。因为ฦjaທva编译器会留意类库的使用方式——确保正确的
服务器。这是无价的辅助学习手段。
感谢genkiyookaທ和他的同事digigaທmi,
bufferedreader=ne9bufferedreader
system色ter肉,并保证其方แ法被正确调用,因此,除非有某个条件使得run终止,
否则它将永远运行下去在本章后面你将看到เ如何安全地通知线程终止。thread类的staທrt方แ法将为线程执
行特殊的初始。
你可以看到在main里创น建并运行了一些线程,然后调用run方法。所以整个步骤是:在构造器中调用了start方法来配,先调用构造器来构造对
象,然后由á线程执行机制调用run。如
果你不调用start在后面的例子你将看到เ,你不必在构造器里调用start,线
程永远不会启动。
因为ฦ线程调度机制的行为不是确定性的,所以每次运行该程序都会产生不同的输出结果。
实际上,你要是在不同的jdk版本下运行这个ฐ简单的程序,就会现程序输出的差异非常大。
比如,以前版本的jdk经常都是不切片时间的,所以线程1可能先循环执行完毕,然后是
线程2完成其所有循环,如此下去。这样的做法除了启动这些线程开销更加昂贵以外,在
实质上,与调用一个子程序然后马上完成该子程序所有循环的做法类似。用jdk1้4๒你能
得到与simplethreadjava类似的输出,这表明了调度器执行了更合适的时间切片行为,
每个线程看起来都得到了有秩序的服务。总的说来,jdk这种行为上的变化并没有被sun所
提到เ,所以你不能ม对线程的行为作任何假设。应付这类问题最好的办法就是在编写线程代
码时尽可能保守些。
当在main中创建若干个ฐthread对象的时候,并没有获得它们中ณ任何一个的引用。对于
普通的对象,这会使它成为ฦ垃圾回收器要回收的目标,但对于thread对象就不会了。每个ฐ
thread对象需要“注册”自己,所以实际上在某个地方存在着对它的引用,垃圾收集器只有
在线程离开了run并且死亡之后才能把它清理掉。
让步
如果你知道run方法中已经完成了所需的工作,你可以给线程调度机制一个暗示ิ:你的
工作已经做得差不多了,可以让别的线程使用处理器了。这个暗示ิ将通过调用yield
方法的形式来作出。不过这只是一个暗示ิ,没有任何机制保证它将会被采纳。
我们可以修改前面的例子,在每次循环之ใ后调用yield。
:๘9gthreaທdjava
suggesting9hento9itchthreads9ithyield
importuceeckelsimpletest;
publi9๗gthreadextendsthreaທd{
privatestaທti9๗e9test;
privateint9๗=5;
privatestati9t=0;
publi9๗gthread{
super""+ใ++thread9t;
start;
}
pubຘli9g{
return"ิ#ี"+