??xml version="1.0" encoding="utf-8" standalone="yes"?>
多线E的用?/SPAN>
E序的某一部分正在{一个事件或资源Q而你又不惌它把整个E序都给d?jin)。因此你可以创徏一个与该事件或资源相关的线E,让它与主E序分开来运行,例如在运的同时Q监视键盘的输入?/SPAN>
多线E的~点
׃n资源Ӟ?x)降低运行效率;额外的消?/SPAN>CPU资源Q用不当会(x)抛出异常、或引发一些不正常状态;与^台有一定的相关性?/SPAN>
U程的状?/SPAN>
1. newQ线E刚刚徏好,q未启动?/SPAN>
2. runableQ排在队列中{待被分?/SPAN>CPU旉片?/SPAN>
3. deadQ被中止的状态?/SPAN>
4. blockedQ由于非CPU旉片原因而不能运行的U程Q如sleepQ)(j)?/SPAN>waitQ)(j)?/SPAN>IO问题Q?/SPAN>
实现Ҏ(gu)
1. 创造一个类d?/SPAN>runable接口Qƈ重写runQ)(j)Ҏ(gu)Q然后实例化出来一个对?/SPAN>AQ然后在ȝ序中?/SPAN>A作ؓ(f)参数创徏一?/SPAN>Threadcȝ对象Q调用其中的startQ)(j)来启动线E。(恺与孙鑫推荐用此种Ҏ(gu)创徏U程Q?/SPAN>
2. ?/SPAN>ThreadcMzZ个类Q重?/SPAN>runQ)(j)Ҏ(gu)Q然后在ȝE中创徏一个对象,调用其中?/SPAN>startQ)(j)Ҏ(gu)来启动线E。(BruceEckel则推荐用此种Ҏ(gu)创徏U程Q?/SPAN>
主要函数
startQ)(j)Q?/SPAN>启动一个进E?/SPAN>
stopQ)(j)Q?/SPAN>l束一个进E,׃它不?x)释攑֯象的锁,所以现在已l不提倡用它?jin)?/SPAN>
suspendQ)(j)Q?/SPAN>挂vq程。(不推荐用)(j)
resumeQ)(j)Q?/SPAN>唤醒q程。(不推荐用)(j)
interruptQ)(j)Q打?/SPAN>
yieldQ)(j)Q?/SPAN>d攑ּCPU的占用,也可能在未执行到此语句时Q被虚拟机强制放弃,所以一般不能用来严格控制线E?/SPAN>
sleepQ)(j)Q?/SPAN>暂停U程一D|_(d)然后重新q入CPU使用序列排队Q所以ƈ不能准确地设定线E的暂停旉Q所讑֮的时间只是最的使用旉Q异常情况不)(j)。另外,一定要攑֜try域中?/SPAN>
setPriorityQ)(j)Q设|线E的优先U?/SPAN>
getPriorityQ)(j)Q?/SPAN>获取U程的优先。由不同操作pȝ的优先讑֮不太一P所以对优先U的操作最好?/SPAN>MIN_PRIORITY, NORM_PRIORITY, ?/SPAN>MIN_PRORITY来表C?/SPAN>
setDaemonQ)(j)Q?/SPAN>用于线E设|ؓ(f)DaemonU程Q但必须在线E启动之前?/SPAN>
isDaemonQ)(j)Q?/SPAN>判断U程是否?/SPAN>DaemonU程?/SPAN>
isAliveQ)(j)Q?/SPAN>判断U程是否q存在?/SPAN>
joinQ)(j)Q?/SPAN>用于不同U程间的联系Q当一个线E?/SPAN>1调用另一个线E?/SPAN>2?/SPAN>joinQ)(j)Ҏ(gu)Q那么线E?/SPAN>1在线E?/SPAN>2l束前就?x)被挂vQ除非设|?/SPAN>timeoutQ。由于也可以?/SPAN>interruptQ)(j)打断Q所以也要放?/SPAN>try域中?/SPAN>
currentThreadQ)(j)Q?/SPAN>获得当前U程Q即执行此方法的U程?/SPAN>
getNameQ)(j)Q?/SPAN>获得U程的名字?/SPAN>
getThreadGroupQ)(j)Q?/SPAN>获得U程所属的U程l?/SPAN>
DaemonU程
DaemonU程在后台运行,当所有的?/SPAN>DaemonU程l束?jin)?/SPAN>DaemonU程也随之结束,另外?/SPAN>DaemonU程中创建的U程Q都默认讄?/SPAN>DaemonU程?/SPAN>
解决׃n资源冲突
防止资源冲突的两U方法:(x)同步块和同步Ҏ(gu)?/SPAN>
同步?/SPAN>Q需要将要同步的代码攑ֈsynchronizedQ?/SPAN>objectQ?/SPAN>{}中,׃每个对象均有一个监视器Q锁Q,所以其中的object可ؓ(f)Lcȝ对象Q静(rn)态方法则默认使用cȝClass对象?/SPAN>
同步Ҏ(gu)Q?/SPAN>需要同步的代码攑ֈ某一Ҏ(gu)中,且将Ҏ(gu)讄?/SPAN>synchronized?/SPAN>
q程间的协作
当发?/SPAN>nodifyQ)(j)的时候,发生waitQ)(j)的地Ҏ(gu)可以l箋q行Q且它们必须攑֜同一个对象的同步块或同步Ҏ(gu)之中?/SPAN>
waitQ)(j)后将当前U程攑ֈ一个等待队列中Q?/SPAN>nodifyQ)(j)后从{待队列中随意激zM个?/SPAN>
U程l?/SPAN>
U程l?/SPAN>是一个装U程的容器。用Joshua BlochQ也是负责修补和改q?/SPAN>JDK 1.2?/SPAN>Java容器cd的那?/SPAN>Sun的Y件架构师Q的话来Ԍ它的意义可以概括为:(x)“最好把U程l看成是一ơ不成功的实验,或者就当它Ҏ(gu)不存在。?SPAN lang=EN-US>
Javaq行时的几个pȝU程
Referrence HandlerQ系l用来控制引用的U程。(优先U:(x)10Q?/SPAN>
FinalizerQ垃圾收集器。(优先U:(x)8Q?/SPAN>
Singnal DispatcherQ信号分配器。(优先U:(x)10Q?/SPAN>
Compiler ThreadQ用于优化。(优先U:(x)10Q?/SPAN>
其他一些小问题
?SPAN style="FONT: 7pt 'Times New Roman'"> JAVA中只有除long?/SPAN>double以外的基本类型的赋值和q回式原子操作,其他的操作即使看上去非常像原子操作,我们也最好加?/SPAN>synchronizedQ这也算?/SPAN>JAVA?/SPAN>C++的一点不同之处吧。最安全的原子操作只有读取和?/SPAN>primitive赋D两种?/SPAN>
?SPAN style="FONT: 7pt 'Times New Roman'"> 如果你要防止讉K资源冲突Q就索性把cM的所有的Ҏ(gu)全都synchronize?jin),因?f)判断哪些Ҏ(gu)?/SPAN>synchronize很难的,而且synchronizeҎ(gu)能的媄(jing)响也不大?/SPAN>
?SPAN style="FONT: 7pt 'Times New Roman'"> 对象使用完之后,要记得赋gؓ(f)nullQ也是释放其内存空间?/SPAN>
?SPAN style="FONT: 7pt 'Times New Roman'"> Threadcȝ对象不会(x)因ؓ(f)没有引用而被垃圾攉h集掉Q直到其U程l束?/SPAN>
?SPAN style="FONT: 7pt 'Times New Roman'"> volatile标记用来排除优化Q否则,~译器仅?x)读取缓存中的变量?/SPAN>
参考:(x)?/SPAN>Think In JAVAW三版》、翁?/SPAN>java教学视频、孙?/SPAN>java教学视频?/SPAN>
引用
Java中的对象定义都是定义Z个引用,其本wƈ不存储对象的数|只是存储指向对象内存块儿的指针,其本质就是不能运的指针?/span>
Break 跛_双层循环
格式Q?/span>break 标号
h部分goto语句功能Q用于蟩出@环,其是双层@环?/span>
This关键?/span>
this关键字可以ؓ(f)已调用了(jin)其方法的那个对象生成相应的句柄,卌用这个函数的那个对象是this?/span>this可以在一个构造函C调用另一个构造函敎ͼ但只能调用一个?/span>
af ( int a ){} //构造函?/span>1Q即被调用的构造函敎ͼ(j)
af ( int a , String b){ this(a); } //构造函?/span>2
finalize() 在运行垃圑֛收器之前q行的函?/span>
?rn)态的东西属于c,动态的东西属于对象?/span>
对象初始化的序
1. 创徏一个对象时Q先要找到其对应?/span>.class文g?/span>
2. (g)查对象是否有父类。如果有父类Q则需要执行父cM的静(rn)态初始化?/span>
3. 执行c自己本w的?rn)态初始化?/span>
4. new语句首先?x)在内存内分配一个够的I间Q且全部?/span>0?/span>
5. 依次执行父类中的定义初始化和构造函数?/span>
6. 依次执行父类中的定义初始化和构造函数。(完成Q?/span>
?rn)态初始化?/span>
static{ c1 = new cpu(1);
c2 = new cpu(2); }
定义初始?/span>(用于无名cȝ构造函?/span>)
{ c1 = new cpu(1);
c2 = new cpu(2); }
每个~译单元都是?/span>.java为结文gQ在一个编译单元里Q只可以有一?/span>publicc,且这个类的名字必M原文件的文g名相同?/span>
cȝ讉K说明W?/span>
1. publicQ?/span> 界面讉K
2. privateQ?/span> 不能接触
3. protectQ?/span> 某种友好
4. frienglyQ?/span> ~省?/span>
?rn)态的成员变量qcd子类共同使用Q其他变量则各有一套?/span>
l定
动态绑定(Java常用Q:(x)在程序的q行中才军_要执行的函数为哪一个函敎ͼ优点是用灵z,~点是执行效率低?/span>
?rn)态绑定(C/C++常用Q:(x)在程序运行之前就已经定需要执行的函数Q有~点与动态相反?/span>
Final
final的成员变量:(x)只可赋gơ,有时?x)用?/span>Java中的帔R?/span>
final的函数变量:(x)防止l承者改变其实现?/span>
final的类Q不可ѝ?/span>
抽象cd抽象Ҏ(gu)
n 抽象cM用仅是表达接口,其所有方法都是没有函C的声明,且不能生对象?/span>
n 包含一个抽象方法的cd是一个抽象类?/span>
n 没有抽象Ҏ(gu)的类也可以是一个抽象类?/span>
n 从抽象类中承的cd覆盖所有的抽象Ҏ(gu)Q否则仍是一个抽象类?/span>
接口
n 接口是一个所有方法全是抽象方法的cR?/span>
n 接口可以l承Q且可以实现多承,但只可以从接口中l承?/span>
n 无论是否声明Q接口中的所有方法全?/span>public的,所有成员变量全?/span>public static final的,其变量的值都需在编译前定?/span>
n 一个类可以在承其他类的同时实现多个接口?/span>
内部c(inner classQ?/span>
n 内部cd是就是写在类中(甚至写在cd函数中)(j)的类Q其基本{同于类内的成员函数Q包括可以加讉K说明W、可以访问私有变量等Ҏ(gu)?/span>
n 源文件编译后Q内部类成为独立的.class文g?/span>
n U有内部cd往用于提供接口的同旉藏自q实现l节?/span>