浅析Java线程的三种实现
一、前言
java.lang.Thread類是java的線程類。當(dāng)生成一個Thread類的對象后,一個新的線程就產(chǎn)生了。Java中每一個線程都是通過某個特定的Thread對象的方法run()來完成其操作的,方法run()稱為線程體。
下面簡單介紹Thread類的幾種構(gòu)造方法:
public Thread() public Thread(Runnable target) public Thread(Runnable target,String name) public Thread(String name) 參數(shù) target 是一個實現(xiàn)Runnable 接口的實例,它的作用是實現(xiàn)線程體的run()方法。目標(biāo) target 可為null,表示有本身實例來執(zhí)行程序。name參數(shù)指定線程名字,如果沒有指定則由JVM虛擬機自動分配,如thread-1、thread-2等名字。在Java中有兩種方法實現(xiàn)線程體:一是繼承線程類Thread,二是實現(xiàn)接口Runnable
二、實現(xiàn)方式1
繼承線程類Thread并重寫其中的方法run(),初始化這個類實例的時候,目標(biāo)target為null,表示由本實例來執(zhí)行線程體。缺點:由于Java只支持單重繼承,用這種方法定義的類不能再繼承其他父類。代碼清單如下:
public class Demo1 extends Thread{boolean isRunning = true; //終止標(biāo)記public void run(){ //方法體 while(isRunning){ try{ . . . }catch(InterruptedException e){ e.printStackTrace(); } } } public static void main(String[] args){demo1 =new Demo1(); //實例化對象 demo1.start(); } } 說明:在main主方法中通過 new Demo1()創(chuàng)建子線程,并通過demo1.start()啟動子線程。main主方法所在線程為主線程,主線程負(fù)責(zé)管理其他子線程。為了能夠使線程停止,在主線程中增加一個標(biāo)識,通過改變該標(biāo)識 demo1.isRunning =false,從而結(jié)束這個線程。二、實現(xiàn)方式2
提供一個實例接口Runnable的類作為一個線程的目標(biāo)對象,在構(gòu)造Thread類時把目標(biāo)對象(實現(xiàn)Runnable的類)傳遞給這個線程實例,有該目標(biāo)對象(實現(xiàn)Runnable的類)提供線程run()的方法。優(yōu)點:這個時候?qū)崿F(xiàn)接口Runnable的類仍然可以繼承其他父類。代碼清單如下:
public class Demo2 implements Runnable{private Thread myThread; boolean isRunning = true; //終止標(biāo)記public void run(){ //方法體 while(isRunning){ try{ . . . }catch(InterruptedException e){ e.printStackTrace(); } } } public Demo2(){ //構(gòu)造函數(shù) myThread =new Thread(this); //實例化對象 myThread.start(); } public static void main(String[] args){Demo2 demo2 =new Demo2();}}說明:首先創(chuàng)建一個Thread成員變量myThread,然后用構(gòu)造方法new Thread(this)創(chuàng)建一個線程對象,其中創(chuàng)建線程使用的構(gòu)造方法是Thread(Runnable target),其中的this代表本實例,它是一個實現(xiàn)了Runnable接口的實現(xiàn)類。
三、實現(xiàn)方式3
方法3是對方法2的一種改進(jìn),代碼清單如下:
public class Demo3 implements Runnable{private Thread myThread; boolean isRunning = true; //終止標(biāo)記public Demo3(){ //構(gòu)造函數(shù) myThread =new Thread(new Runnable(){ public void run(){ //方法體 while(isRunning){ try{ . . . }catch(InterruptedException e){ e.printStackTrace(); } } }}); myThread.start();}public static void main(String[] args){Demo3 demo3 =new Demo3(); } }說明:與方式2比較,我們發(fā)現(xiàn)Frame類不再實現(xiàn)Runnable接口了,而是在實例化Thread類的時候, 定義了一個實現(xiàn)Runnable接口的匿名內(nèi)部類。該方法在Android應(yīng)用開發(fā)中經(jīng)常采用。
三、總結(jié)
看完方式2和方式3后,可能會有些糊涂,這里有必要重新闡述一下它們的區(qū)別:
方式3采用Thread(Runnable target)構(gòu)造方法創(chuàng)建一個線程,需要提供一個Runnable接口對象,需要提供的參數(shù)是實現(xiàn)了Runnable接口的匿名內(nèi)部類對象。
方式2采用Thread()構(gòu)造方法創(chuàng)建一個線程,新建一個Thread類,同時重新run()方法。
總結(jié)
以上是生活随笔為你收集整理的浅析Java线程的三种实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数码管的使用方法
- 下一篇: 好的Java编程习惯