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