java多线程的使用
㈠ java多线程有几种实现方法
继承Thread类来实现多线程:
当我们自定义的类继承Thread类后,该类就为一个线程类,该类为一个独立的执行单元,线程代码必须编写在run()方法中,run方法是由Thread类定义,我们自己写的线程类必须重写run方法。
run方法中定义的代码为线程代码,但run方法不能直接调用,如果直接调用并没有开启新的线程而是将run方法交给调用的线程执行
要开启新的线程需要调用Thread类的start()方法,该方法自动开启一个新的线程并自动执行run方法中的内容
*java多线程的启动顺序不一定是线程执行的顺序,各个线程之间是抢占CPU资源执行的,所有有可能出现与启动顺序不一致的情况。
CPU的调用策略:
如何使用CPU资源是由操作系统来决定的,但操作系统只能决定CPU的使用策略不能控制实际获得CPU执行权的程序。
线程执行有两种方式:
1.抢占式:
目前PC机中使用最多的一种方式,线程抢占CPU的执行权,当一个线程抢到CPU的资源后并不是一直执行到此线程执行结束,而是执行一个时间片后让出CPU资源,此时同其他线程再次抢占CPU资源获得执行权。
2.轮循式;
每个线程执行固定的时间片后让出CPU资源,以此循环执行每个线程执行相同的时间片后让出CPU资源交给下一个线程执行。
㈡ Java澶氱嚎绋嫔埯瀛﹁呮寚鍗楋纸3锛夛细浣跨敤Runnable鎺ュ彛鍒涘缓绾跨▼
銆銆涓娄竴绡 Java澶氱嚎绋嫔埯瀛﹁呮寚鍗楋纸 锛 鐢═hread绫诲垱寤虹嚎绋
銆銆瀹炵幇Runnable鎺ュ彛镄勭被蹇呴’浣跨敤Thread绫荤殑瀹炰緥镓嶈兘鍒涘缓绾跨▼ 阃氲繃Runnable鎺ュ彛鍒涘缓绾跨▼鍒嗕负涓ゆ
銆銆 灏嗗疄鐜癛unnable鎺ュ彛镄勭被瀹炰緥鍖
銆銆 寤虹珛涓涓猅hread瀵硅薄 骞跺皢绗涓姝ュ疄渚嫔寲钖庣殑瀵硅薄浣滀负鍙傛暟浼犲叆Thread绫荤殑鏋勯犳柟娉
銆銆链钖庨氲繃Thread绫荤殑start鏂规硶寤虹珛绾跨▼
銆銆涓嬮溃镄勪唬镰佹紨绀轰简濡备綍浣跨敤Runnable鎺ュ彛𨱒ュ垱寤虹嚎绋
銆銆 packagemythread;{publicvoidrun(){System out println(Thread currentThread() getName());}publicstaticvoidmain(String[]args){MyRunnablet =newMyRunnable();MyRunnablet =newMyRunnable();Threadthread =newThread(t MyThread );Threadthread =newThread(t );thread setName( MyThread );thread start();thread start();}}
銆銆涓婇溃浠g爜镄勮繍琛岀粨鏋滃备笅
lishixin/Article/program/Java/gj/201311/27466
㈢ Java线程怎样使用
多进程是指操作系统能同时运行多个任务(程序),多线程是指在同一程序中有多个顺序流在执行。
在java中创建一个线程有两种方法:
packagecom.thread;
publicclassThreadTest1{
publicstaticvoidmain(String[]args){
Runnable1r=newRunnable1();
//r.run();并不是线程开启,而是简单的方法调用
Threadt=newThread(r);//创建线程
//t.run();//如果该线程是使用独立的Runnable运行对象构造的,则调用该Runnable对象的run方法;否则,该方法不执行任何操作并返回。
t.start();//线程开启
for(inti=0;i<100;i++){
System.out.println("main:"+i);
}
}
}
{
publicvoidrun(){
for(inti=0;i<100;i++){
System.out.println("Thread-----:"+i);
}
}
}
㈣ Java的线程在项目中一般会有什么具体的应用
java线程在项目中的应用场景如下:
场景一:一个业务逻辑有很多次的循环,每次循环之间没有影响,比如验证1万条url路径是否存在,正常情况要循环1万次,逐个去验证每一条URL,这样效率会很低,假设验证一条需要1分钟,总共就需要1万分钟,有点恐怖。这时可以用多线程,将1万条URL分成50等份,开50个线程,没个线程只需验证200条,这样所有的线程执行完是远小于1万分钟的。
场景二:需要知道一个任务的执行进度,比如我们常看到的进度条,实现方式可以是在任务中加入一个整型属性变量(这样不同方法可以共享),任务执行一定程度就给变量值加1,另外开一个线程按时间间隔不断去访问这个变量,并反馈给用户。
总之使用多线程就是为了充分利用cpu的资源,提高程序执行效率,当你发现一个业务逻辑执行效率特别低,耗时特别长,就可以考虑使用多线程。不过CPU执行哪个线程的时间和顺序是不确定的,即使设置了线程的优先级,因此使用多线程的风险也是比较大的,会出现很多预料不到的问题,一定要多熟悉概念,多构造不同的场景去测试才能够掌握!
㈤ 什么是java多线程详解
线程对象是可以产生线程的对象。比如在Java平台中Thread对象,Runnable对象。线程,是指正在执行的一个指点令序列。在java平台上是指从一个线程对象的start()开始,运行run方法体中的那一段相对独立的过程。相比于多进程,多线程的优势有:
(1)进程之间不能共享数据,线程可以;
(2)系统创建进程需要为该进程重新分配系统资源,故创建线程代价比较小;
(3)Java语言内置了多线程功能支持,简化了java多线程编程。
一、创建线程和启动
(1)继承Thread类创建线程类
通过继承Thread类创建线程类的具体步骤和具体代码如下:
• 定义一个继承Thread类的子类,并重写该类的run()方法;
• 创建Thread子类的实例,即创建了线程对象;
• 调用该线程对象的start()方法启动线程。
复制代码
class SomeThead extends Thraad {
public void run() {
//do something here
}
}
public static void main(String[] args){
SomeThread oneThread = new SomeThread();
步骤3:启动线程:
oneThread.start();
}
复制代码
(2)实现Runnable接口创建线程类
通过实现Runnable接口创建线程类的具体步骤和具体代码如下:
• 定义Runnable接口的实现类,并重写该接口的run()方法;
• 创建Runnable实现类的实例,并以此实例作为Thread的target对象,即该Thread对象才是真正的线程对象。
复制代码
class SomeRunnable implements Runnable {
public void run() {
//do something here
}
}
Runnable oneRunnable = new SomeRunnable();
Thread oneThread = new Thread(oneRunnable);
oneThread.start();
复制代码
(3)通过Callable和Future创建线程
通过Callable和Future创建线程的具体步骤和具体代码如下:
• 创建Callable接口的实现类,并实现call()方法,该call()方法将作为线程执行体,并且有返回值。
• 创建Callable实现类的实例,使用FutureTask类来包装Callable对象,该FutureTask对象封装了该Callable对象的call()方法的返回值。
• 使用FutureTask对象作为Thread对象的target创建并启动新线程。
• 调用FutureTask对象的get()方法来获得子线程执行结束后的返回值其中,Callable接口(也只有一个方法)定义如下:
复制代码
public interface Callable {
V call() throws Exception;
}
步骤1:创建实现Callable接口的类SomeCallable(略);
步骤2:创建一个类对象:
Callable oneCallable = new SomeCallable();
步骤3:由Callable创建一个FutureTask对象:
FutureTask oneTask = new FutureTask(oneCallable);
注释: FutureTask是一个包装器,它通过接受Callable来创建,它同时实现了 Future和Runnable接口。
步骤4:由FutureTask创建一个Thread对象:
Thread oneThread = new Thread(oneTask);
步骤5:启动线程:
oneThread.start();
㈥ 鍦↗ava 涓澶氱嚎绋嬬殑瀹炵幇鏂规硶链夊摢浜涳纴濡备綍浣跨敤锝烇綖锝烇綖锝烇綖锝烇綖锝烇綖锝烇綖锝烇綖锝烇綖锝烇綖镐
1銆 璁よ瘑Thread鍜孯unnable
Java涓瀹炵幇澶氱嚎绋嬫湁涓ょ嶉斿缎锛氱户镓縏hread绫绘垨钥呭疄鐜癛unnable鎺ュ彛銆俣unnable鏄鎺ュ彛锛屽缓璁鐢ㄦ帴鍙g殑鏂瑰纺鐢熸垚绾跨▼锛屽洜涓烘帴鍙e彲浠ュ疄鐜板氱户镓匡纴鍐典笖Runnable鍙链変竴涓猺un鏂规硶锛屽緢阃傚悎缁ф圹銆傚湪浣跨敤Thread镄勬椂鍊椤彧闇缁ф圹Thread锛屽苟涓拢ew涓涓瀹炰緥鍑烘潵锛岃皟鐢╯tart()鏂规硶鍗冲彲浠ュ惎锷ㄤ竴涓绾跨▼銆
Thread Test = new Thread();
Test.start();
鍦ㄤ娇鐢≧unnable镄勬椂鍊欓渶瑕佸厛new涓涓瀹炵幇Runnable镄勫疄渚嬶纴涔嫔悗钖锷═hread鍗冲彲銆
Test impelements Runnable;
Test t = new Test();
Thread test = new Thread(t);
test.start();
镐荤粨锛歍hread鍜孯unnable鏄瀹炵幇java澶氱嚎绋嬬殑2绉嶆柟寮忥纴runable鏄鎺ュ彛锛宼hread鏄绫伙纴寤鸿浣跨敤runable瀹炵幇java澶氱嚎绋嬶纴涓岖″备綍锛屾渶缁堥兘闇瑕侀氲繃thread.start()𨱒ヤ娇绾跨▼澶勪簬鍙杩愯岀姸镐併
2銆 璁よ瘑Thread镄剆tart鍜宺un
1锛 start锛
鐢╯tart鏂规硶𨱒ュ惎锷ㄧ嚎绋嬶纴鐪熸e疄鐜颁简澶氱嚎绋嬭繍琛岋纴杩欐椂镞犻渶绛夊緟run鏂规硶浣扑唬镰佹墽琛屽畬姣曡岀洿鎺ョ户缁镓ц屼笅闱㈢殑浠g爜銆傞氲繃璋幂敤Thread绫荤殑start()鏂规硶𨱒ュ惎锷ㄤ竴涓绾跨▼锛岃繖镞舵ょ嚎绋嫔勪簬灏辩华锛埚彲杩愯岋级鐘舵侊纴骞舵病链夎繍琛岋纴涓镞﹀缑鍒皊pu镞堕棿鐗囷纴灏卞紑濮嬫墽琛宺un()鏂规硶锛岃繖閲屾柟娉时un()绉颁负绾跨▼浣掳纴瀹冨寘钖浜呜佹墽琛岀殑杩欎釜绾跨▼镄勫唴瀹癸纴Run鏂规硶杩愯岀粨𨱒燂纴姝ょ嚎绋嬮殢鍗崇粓姝銆
2锛 run锛
run()鏂规硶鍙鏄绫荤殑涓涓鏅阃氭柟娉曡屽凡锛屽傛灉鐩存帴璋幂敤Run鏂规硶锛岀▼搴忎腑渚濈劧鍙链変富绾跨▼杩欎竴涓绾跨▼锛屽叾绋嫔簭镓ц岃矾寰勮缮鏄鍙链変竴𨱒★纴杩樻槸瑕侀‘搴忔墽琛岋纴杩樻槸瑕佺瓑寰卹un鏂规硶浣撴墽琛屽畬姣曞悗镓嶅彲缁х画镓ц屼笅闱㈢殑浠g爜锛岃繖镙峰氨娌℃湁杈惧埌鍐欑嚎绋嬬殑鐩镄勚
镐荤粨锛氲皟鐢╯tart鏂规硶鏂瑰彲钖锷ㄧ嚎绋嬶纴钥宺un鏂规硶鍙鏄痶hread镄勪竴涓鏅阃氭柟娉曡皟鐢锛岃缮鏄鍦ㄤ富绾跨▼閲屾墽琛屻
3銆 绾跨▼鐘舵佽存槑
绾跨▼鐘舵佷粠澶х殑鏂归溃𨱒ヨ达纴鍙褰掔粨涓猴细鍒濆嬬姸镐併佸彲杩愯岀姸镐併佷笉鍙杩愯岀姸镐佸拰娑堜骸鐘舵侊纴鍏蜂綋鍙缁嗗垎涓轰笂锲炬墍绀7涓鐘舵侊纴璇存槑濡备笅锛
1锛 绾跨▼镄勫疄鐜版湁涓ょ嶆柟寮忥纴涓鏄缁ф圹Thread绫伙纴浜屾槸瀹炵幇Runnable鎺ュ彛锛屼絾涓岖℃庢牱锛屽綋鎴戜滑new浜唗hread瀹炰緥钖庯纴绾跨▼灏辫繘鍏ヤ简鍒濆嬬姸镐侊绂
2锛 褰撹ュ硅薄璋幂敤浜唖tart()鏂规硶锛屽氨杩涘叆鍙杩愯岀姸镐侊绂
3锛 杩涘叆鍙杩愯岀姸镐佸悗锛屽綋璇ュ硅薄琚镎崭綔绯荤粺阃変腑锛岃幏寰桟PU镞堕棿鐗囧氨浼氲繘鍏ヨ繍琛岀姸镐侊绂
4锛 杩涘叆杩愯岀姸镐佸悗case灏辨瘆杈冨氾纴澶ц嚧链夊备笅𨱍呭舰锛
路run()鏂规硶鎴杕ain()鏂规硶缁撴潫钖庯纴绾跨▼灏辫繘鍏ョ粓姝㈢姸镐侊绂
路褰撶嚎绋嬭皟鐢ㄤ简镊韬镄剆leep()鏂规硶鎴栧叾浠栫嚎绋嬬殑join()鏂规硶锛屽氨浼氲繘鍏ラ樆濉炵姸镐(璇ョ姸镐佹棦锅沧㈠綋鍓岖嚎绋嬶纴浣嗗苟涓嶉喷鏀炬墍鍗犳湁镄勮祫婧)銆傚綋sleep()缁撴潫鎴杍oin()缁撴潫钖庯纴璇ョ嚎绋嬭繘鍏ュ彲杩愯岀姸镐侊纴缁х画绛夊緟OS鍒嗛厤镞堕棿鐗囷绂
路褰撶嚎绋嫔垰杩涘叆鍙杩愯岀姸镐(娉ㄦ剰锛岃缮娌¤繍琛)锛屽彂鐜板皢瑕佽皟鐢ㄧ殑璧勬簮琚阌佺墷(synchroniza,lock)锛屽皢浼氱珛鍗宠繘鍏ラ挛姹犵姸镐侊纴绛夊緟銮峰彇阌佹爣璁(杩欐椂镄勯挛姹犻噷涔熻稿凡缁忔湁浜嗗叾浠栫嚎绋嫔湪绛夊緟銮峰彇阌佹爣璁帮纴杩欐椂瀹冧滑澶勪簬阒熷垪鐘舵侊纴镞㈠厛鍒板厛寰)锛屼竴镞︾嚎绋嬭幏寰楅挛镙囱板悗锛屽氨杞鍏ュ彲杩愯岀姸镐侊纴绛夊緟OS鍒嗛厤CPU镞堕棿鐗囷绂
路褰撶嚎绋嬭皟鐢╳ait()鏂规硶钖庝细杩涘叆绛夊緟阒熷垪(杩涘叆杩欎釜鐘舵佷细閲婃斁镓鍗犳湁镄勬墍链夎祫婧愶纴涓庨樆濉炵姸镐佷笉钖)锛岃繘鍏ヨ繖涓鐘舵佸悗锛屾槸涓嶈兘镊锷ㄥ敜阅掔殑锛屽繀椤讳緷闱犲叾浠栫嚎绋嬭皟鐢╪otify()鎴杗otifyAll()鏂规硶镓嶈兘琚鍞ら啋(鐢变簬notify()鍙鏄鍞ら啋涓涓绾跨▼锛屼絾鎴戜滑鐢变笉鑳界‘瀹氩叿浣揿敜阅掔殑鏄鍝涓涓绾跨▼锛屼篃璁告垜浠闇瑕佸敜阅掔殑绾跨▼涓嶈兘澶熻鍞ら啋锛屽洜姝ゅ湪瀹为檯浣跨敤镞讹纴涓鑸閮界敤notifyAll()鏂规硶锛屽敜阅掓湁镓绾跨▼)锛岀嚎绋嬭鍞ら啋钖庝细杩涘叆阌佹睁锛岀瓑寰呰幏鍙栭挛镙囱般
路褰撶嚎绋嬭皟鐢╯top鏂规硶锛屽嵆鍙浣跨嚎绋嬭繘鍏ユ秷浜$姸镐侊纴浣嗘槸鐢变簬stop鏂规硶鏄涓嶅畨鍏ㄧ殑锛屼笉榧揿姳浣跨敤锛屽ぇ瀹跺彲浠ラ氲繃run鏂规硶閲岀殑𨱒′欢鍙橀氩疄鐜扮嚎绋嬬殑stop銆
㈦ 鑳借В閲娄竴涓媕ava镄勭嚎绋嬬殑浣跨敤
闅忕潃璁$畻链虹殑椋为熷彂灞曪纴涓浜鸿$畻链轰笂镄勬搷浣灭郴缁熶篃绾风悍閲囩敤澶氢换锷″拰鍒嗘椂璁捐★纴灏嗘棭链熷彧链夊ぇ鍨嬭$畻链烘墠鍏锋湁镄勭郴缁熺壒镐у甫鍒颁简涓浜鸿$畻链虹郴缁熶腑銆备竴鑸鍙浠ュ湪钖屼竴镞堕棿鍐呮墽琛屽氢釜绋嫔簭镄勬搷浣灭郴缁熼兘链夎繘绋嬬殑姒傚康銆备竴涓杩涚▼灏辨槸涓涓镓ц屼腑镄勭▼搴忥纴钥屾疮涓涓杩涚▼閮芥湁镊宸辩嫭绔嬬殑涓鍧楀唴瀛樼┖闂淬佷竴缁勭郴缁熻祫婧愩傚湪杩涚▼姒傚康涓锛屾疮涓涓杩涚▼镄勫唴閮ㄦ暟鎹鍜岀姸镐侀兘鏄瀹屽叏镫绔嬬殑銆侸ava绋嫔簭阃氲繃娴佹带鍒舵潵镓ц岀▼搴忔祦锛岀▼搴忎腑鍗曚釜椤哄簭镄勬祦鎺у埗绉颁负绾跨▼锛屽氱嚎绋嫔垯鎸囩殑鏄鍦ㄥ崟涓绋嫔簭涓鍙浠ュ悓镞惰繍琛屽氢釜涓嶅悓镄勭嚎绋嬶纴镓ц屼笉钖岀殑浠诲姟銆傚氱嚎绋嬫剰锻崇潃涓涓绋嫔簭镄勫氲岃鍙ュ彲浠ョ湅涓婂幓鍑犱箮鍦ㄥ悓涓镞堕棿鍐呭悓镞惰繍琛屻
绾跨▼涓庤繘绋嬬浉浼硷纴鏄涓娈靛畬鎴愭煇涓鐗瑰畾锷熻兘镄勪唬镰侊纴鏄绋嫔簭涓鍗曚釜椤哄簭镄勬祦鎺у埗锛涗絾涓庤繘绋嬩笉钖岀殑鏄锛屽悓绫荤殑澶氢釜绾跨▼鏄鍏变韩涓鍧楀唴瀛樼┖闂村拰涓缁勭郴缁熻祫婧愶纴钥岀嚎绋嬫湰韬镄勬暟鎹阃氩父鍙链夊井澶勭悊鍣ㄧ殑瀵勫瓨鍣ㄦ暟鎹锛屼互鍙娄竴涓渚涚▼搴忔墽琛屾椂浣跨敤镄勫爢镙堛傛墍浠ョ郴缁熷湪浜х敓涓涓绾跨▼锛屾垨钥呭湪钖勪釜绾跨▼涔嬮棿鍒囨崲镞讹纴璐熸媴瑕佹瘆杩涚▼灏忕殑澶氾纴姝e洜濡傛わ纴绾跨▼琚绉颁负杞昏礋钻疯繘绋嬶纸light-weight process锛夈备竴涓杩涚▼涓鍙浠ュ寘钖澶氢釜绾跨▼銆
涓涓绾跨▼鏄涓涓绋嫔簭鍐呴儴镄勯‘搴忔带鍒舵祦銆
1. 杩涚▼锛氭疮涓杩涚▼閮芥湁镫绔嬬殑浠g爜鍜屾暟鎹绌洪棿锛堣繘绋嬩笂涓嬫枃锛 锛岃繘绋嫔垏鎹㈢殑寮阌澶с
2. 绾跨▼锛氲交閲忕殑杩涚▼锛屽悓涓绫荤嚎绋嫔叡浜浠g爜鍜屾暟鎹绌洪棿锛屾疮涓绾跨▼链夌嫭绔嬬殑杩愯屾爤鍜岀▼搴忚℃暟鍣锛圥C锛夛纴绾跨▼鍒囨崲镄勫紑阌灏忋
3. 澶氲繘绋嬶细鍦ㄦ搷浣灭郴缁熶腑锛岃兘钖屾椂杩愯屽氢釜浠诲姟绋嫔簭銆
4. 澶氱嚎绋嬶细鍦ㄥ悓涓搴旂敤绋嫔簭涓锛屾湁澶氢釜椤哄簭娴佸悓镞舵墽琛屻
6锛1锛1 绾跨▼镄勬傚康妯″瀷
Java鍐呭湪鏀鎸佸氱嚎绋嬶纴瀹幂殑镓链夌被閮芥槸鍦ㄥ氱嚎绋嬩笅瀹氢箟镄勶纴Java鍒╃敤澶氱嚎绋嬩娇鏁翠釜绯荤粺鎴愪负寮傛ョ郴缁熴侸ava涓镄勭嚎绋嬬敱涓夐儴鍒嗙粍鎴愶纴濡傚浘6.1镓绀恒
1. 铏氭嫙镄凛PU锛屽皝瑁呭湪Java.lang.Thread绫讳腑銆
2. CPU镓镓ц岀殑浠g爜锛屼紶阃掔粰Thread绫汇
3. CPU镓澶勭悊镄勬暟鎹锛屼紶阃掔粰Thread绫汇
锲6.1绾跨▼
6. 1. 2 绾跨▼浣(1)
Java镄勭嚎绋嬫槸阃氲繃Java.lang.Thread绫绘潵瀹炵幇镄勚傚綋鎴戜滑鐢熸垚涓涓猅hread绫荤殑瀵硅薄涔嫔悗,涓涓鏂扮殑绾跨▼灏变骇鐢熶简銆
姝ょ嚎绋嫔疄渚嬭〃绀筼ava瑙i喷鍣ㄤ腑镄勭湡姝g殑绾跨▼锛岄氲繃瀹冨彲浠ュ惎锷ㄧ嚎绋嬨佺粓姝㈢嚎绋嬨佺嚎绋嬫寕璧风瓑锛屾疮涓绾跨▼閮芥槸阃氲繃绫籘hread鍦↗ava镄勮蒋浠跺寘Java.lang涓瀹氢箟锛屽畠镄勬瀯阃犳柟娉曚负锛
public Thread 锛圱hreadGroup group锛孯unnable target锛孲tring name锛夛绂
鍏朵腑锛実roup 鎸囨槑璇ョ嚎绋嬫墍灞炵殑绾跨▼缁勶绂target瀹为檯镓ц岀嚎绋嬩綋镄勭洰镙囧硅薄锛屽畠蹇呴’瀹炵幇鎺ュ彛Runnable锛 name涓虹嚎绋嫔悕銆侸ava涓镄勬疮涓绾跨▼閮芥湁镊宸辩殑钖岖О锛孞ava鎻愪緵浜嗕笉钖孴hread绫绘瀯阃犲櫒锛屽厑璁哥粰绾跨▼鎸囧畾钖岖О銆傚傛灉name涓簄ull镞讹纴鍒橨ava镊锷ㄦ彁渚涘敮涓镄勫悕绉般
褰扑笂杩版瀯阃犳柟娉旷殑镆愪釜鍙傛暟涓簄ull镞讹纴鎴戜滑鍙寰楀埌涓嬮溃镄勫嚑涓鏋勯犳柟娉曪细
public Thread 锛堬级锛
public Thread 锛圧unnable target锛夛绂
public Thread 锛圧unnable target锛孲tring name锛夛绂
public Thread 锛圫tring name锛夛绂
public Thread 锛圱hreadGroup group锛孯unnable target锛夛绂
public Thread 锛圱hreadGroup group锛孲tring name锛夛绂
涓涓绫诲0鏄庡疄鐜癛unnable鎺ュ彛灏卞彲浠ュ厖褰撶嚎绋嬩綋锛屽湪鎺ュ彛Runnable涓鍙瀹氢箟浜嗕竴涓鏂规硶 run锛堬级锛
public void run锛堬级锛
浠讳綍瀹炵幇鎺ュ彛Runnable镄勫硅薄閮藉彲浠ヤ綔涓轰竴涓绾跨▼镄勭洰镙囧硅薄锛岀被Thread链韬涔熷疄鐜颁简鎺ュ彛Runnable锛屽洜姝ゆ垜浠鍙浠ラ氲繃涓ょ嶆柟娉曞疄鐜扮嚎绋嬩綋銆
锛堜竴锛夊畾涔変竴涓绾跨▼绫伙纴瀹幂户镓跨嚎绋嬬被Thread骞堕吨鍐椤叾涓镄勬柟娉 run锛堬级锛岃繖镞跺湪鍒濆嫔寲杩欎釜绫荤殑瀹炰緥镞讹纴鐩镙噒arget鍙涓簄ull锛岃〃绀虹敱杩欎釜瀹炰緥瀵规潵镓ц岀嚎绋嬩綋銆傜敱浜嶫ava鍙鏀鎸佸崟閲岖户镓匡纴鐢ㄨ繖绉嶆柟娉曞畾涔夌殑绫讳笉鑳藉啀缁ф圹鍏跺畠鐖剁被銆
锛堜簩锛夋彁渚涗竴涓瀹炵幇鎺ュ彛Runnable镄勭被浣滀负涓涓绾跨▼镄勭洰镙囧硅薄锛屽湪鍒濆嫔寲涓涓猅hread绫绘垨钥匮hread瀛愮被镄勭嚎绋嫔硅薄镞讹纴鎶婄洰镙囧硅薄浼犻掔粰杩欎釜绾跨▼瀹炰緥锛岀敱璇ョ洰镙囧硅薄鎻愪緵绾跨▼浣 run锛堬级銆傝繖镞讹纴瀹炵幇鎺ュ彛Runnable镄勭被浠岖劧鍙浠ョ户镓垮叾瀹幂埗绫汇
姣忎釜绾跨▼閮芥槸阃氲繃镆愪釜鐗瑰畾Thread瀵硅薄镄勬柟娉时un( )𨱒ュ畬鎴愬叾镎崭綔镄勶纴鏂规硶run( )绉颁负绾跨▼浣撱傚浘6.2琛ㄧず浜呙ava绾跨▼镄勪笉钖岀姸镐佷互鍙婄姸镐佷箣闂磋浆鎹㈡墍璋幂敤镄勬柟娉曘
锲6.2 绾跨▼镄勭姸镐
1. 鍒涘缓鐘舵(new Thread)
镓ц屼笅鍒楄鍙ユ椂锛岀嚎绋嫔氨澶勪簬鍒涘缓鐘舵侊细
Thread myThread = new MyThreadClass( );
褰扑竴涓绾跨▼澶勪簬鍒涘缓鐘舵佹椂锛屽畠浠呬粎鏄涓涓绌虹殑绾跨▼瀵硅薄锛岀郴缁熶笉涓哄畠鍒嗛厤璧勬簮銆
2. 鍙杩愯岀姸镐( Runnable )
Thread myThread = new MyThreadClass( );
myThread.start( );
褰扑竴涓绾跨▼澶勪簬鍙杩愯岀姸镐佹椂锛岀郴缁熶负杩欎釜绾跨▼鍒嗛厤浜嗗畠闇镄勭郴缁熻祫婧愶纴瀹夋帓鍏惰繍琛屽苟璋幂敤绾跨▼杩愯屾柟娉曪纴杩欐牱灏变娇寰楄ョ嚎绋嫔勪簬鍙杩愯( Runnable )鐘舵併傞渶瑕佹敞镒忕殑鏄杩欎竴鐘舵佸苟涓嶆槸杩愯屼腑鐘舵侊纸Running )锛屽洜涓虹嚎绋嬩篃璁稿疄闄呬笂骞舵湭鐪熸h繍琛屻傜敱浜庡緢澶氲$畻链洪兘鏄鍗曞勭悊鍣ㄧ殑锛屾墍浠ヨ佸湪钖屼竴镞跺埢杩愯屾墍链夌殑澶勪簬鍙杩愯岀姸镐佺殑绾跨▼鏄涓嶅彲鑳界殑锛孞ava镄勮繍琛岀郴缁熷繀椤诲疄鐜拌皟搴︽潵淇濊瘉杩欎簺绾跨▼鍏变韩澶勭悊鍣ㄣ
3. 涓嶅彲杩愯岀姸镐侊纸Not Runnable锛
杩涘叆涓嶅彲杩愯岀姸镐佺殑铡熷洜链夊备笅鍑犳浔锛
1) 璋幂敤浜唖leep锛堬级鏂规硶;
2) 璋幂敤浜唖uspend锛堬级鏂规硶;
3) 涓虹瓑鍊欎竴涓𨱒′欢鍙橀噺锛岀嚎绋嬭皟鐢╳ait锛堬级鏂规硶;
4) 杈揿叆杈揿嚭娴佷腑鍙戠敓绾跨▼阒诲;
涓嶅彲杩愯岀姸镐佷篃绉颁负阒诲炵姸镐侊纸Blocked锛夈傚洜涓烘煇绉嶅师锲狅纸杈揿叆/杈揿嚭銆佺瓑寰呮秷鎭鎴栧叾瀹冮樆濉炴儏鍐碉级锛岀郴缁熶笉鑳芥墽琛岀嚎绋嬬殑鐘舵併傝繖镞跺嵆浣垮勭悊鍣ㄧ┖闂诧纴涔熶笉鑳芥墽琛岃ョ嚎绋嬨
4. 姝讳骸鐘舵侊纸Dead锛
绾跨▼镄勭粓姝涓鑸鍙阃氲繃涓ょ嶆柟娉曞疄鐜帮细镊铹舵挙娑堬纸绾跨▼镓ц屽畬锛夋垨鏄琚锅沧锛堣皟鐢╯top()鏂规硶锛夈傜洰鍓崭笉鎺ㄨ崘阃氲繃璋幂敤stop()𨱒ョ粓姝㈢嚎绋嬬殑镓ц岋纴钥屾槸璁╃嚎绋嬫墽琛屽畬銆
http://www.bc-cn.net/Article/kfyy/java/jc/200410/83.html