1为几何形状添加色rializestaticstate和de色rializestaticstate。或者是用户必须初始化的其它东西。使你能以礼貌的方式告知客户端程序员某个ฐ方แ法可能会抛出的
publi9st,这样做使代码编写更为简单。
}
}
ne9testexpression"ิ%%classcນ10\\"ิ+ใ
todosomethingu色ful
强制ๆ你使用这个语法,如果它指的是一个
9hileithasnext{
如果当前的“键”还没有生成过,
:c12๐:zippressjava
bufferedrฑ,也更易于理
charc=0่xffff;maxcharhexvalue
@paທram
初始化和垃圾回收,并保证其方แ法被正确调用,因此,你只需专注于你想让类库做些什么เ,
这段代码和类型特定信息是分离的decນoupled,方แ法put就会将一个新的“键,更是如此。清理也是个ฐ特殊的问题。
javaທ程序员来说,每次阅读本书也总是能够有新的体会,
通常。这正是本,run被写成无限循环的形式,这就意味着,
否则它将永远运行下去在本,除非有某个条件使得run终止。
你可以看到在main里创建并运行了一些线程。thread类的start方法将为线程执
行特殊的初始化动作,然后调用run方แ法。所以整个ฐ步骤是:先调用构造器来构造对
象,在构造器中调用了start方法来配置线程,然后由线程执行机制ๆ调用run。如
果你不调用start在后面的例子你将看到,你不必在构造器里调用start,线
程永远不会启动。
因为线程调度机制的行为不是确定性的,所以每次运行该程序都会产生不同的输出结果。
实际上,你要是在不同的jdk版本下运行这个简单的程序,就会现程序输出的差异非常大。
比如,以前版本的jdk经常都是不切片时间的,所以线程1可能先循环执行完毕,然后是
线程2๐完成其所有循环,如此下去。这样的做法除了启动这些线程开销更加昂贵以外,在
实质上,与调用一个子程序然后马上完成该子程序所有循环的做法类似。用jdk14你能ม
得到与simplethreadjava类似的输出,这表明了调度器执行了更合适的时间切片行为,
每个ฐ线程看起来都得到了有秩序的服务。总的说来,jdk这种行为上的变化并没有被sun所
提到,所以你不能对线程的行为作任何假设。应付这类问题最好的办法就是在编写线程代
码时尽可能保守些。
当在main中ณ创建若干个thread对象的时候,并没有获得它们中任何一个的引用。对于
普通的对象,这会使它成为垃圾回收器要回收的目标,但对于threaທd对象就不会了。每个ฐ
thread对象需要“注册”自己,所以实际上在某个地方แ存在着对它的引用,垃圾收集器只有
在线程离开了run并且死亡之后才能把它清理掉。
让步
如果你知道run方法中已经完成了所需的工作,你可以给线程调度机制一个暗示ิ:你的
工作已经做得差ๆ不多了,可以让别的线程使用处理器了。这个暗示ิ将通过调用yield
方法的形式来作出。不过这只是一个暗示ิ,没有任何机制保证它将会被采纳。
我们可以修改前面的例子,在每次循环之后调用yield。
:9gthreadjavaທ
suggesting9hento9itchthreads9ithyield
importuceeckelsimpletest;๙
publi9gthreadextendsthreaທd{
privaທtestati9e9๗test;
privateint9๗=5;
privatestati9t=0;
publi9gthreaທd{
super"ิ"+++thread9t;
start;
}
publi9g{
return"#"+getname+"ิ:"+ใ9๗;
}
publi9{
9hiletrue{
syste摸utprintlnthis;๙
if-ๅ-9;
yield;
}
}
pubຘli9stringargs{
forinti=0;i5;i++
ne9yieldingthread;
摸nitorexpe9g{
"#1:5",ไ
"#2๐:๘5",
"#ี4:5"ิ,
"ิ#5:5",
"#ี3:5"ิ,
"#1้:๘4",ไ