Java創(chuàng)建子線程的兩種方法
摘要:
其實(shí)兩種方法歸結(jié)起來看還是一種,都是利用Thread的構(gòu)造器進(jìn)行創(chuàng)建,區(qū)別就是一種是無參的,一種是有參的。
一、繼承Thread線程類:
通過繼承Thread類,重寫run方法,子類對(duì)象就可以調(diào)用start方法啟動(dòng)線程,JVM就會(huì)調(diào)用此線程的run方法。
代碼如下:
public class MyThread extends Thread { public MyThread() { super(); } @Override public void run() { } // 線程執(zhí)行結(jié)束 System.out.println("執(zhí)行完成! " + getName()); } } public class HelloWorld { public static void main(String[] args) { // 創(chuàng)建線程t1 Thread t1 = new MyThread(); ① // 開始線程t1 t1.start(); } }
注意: 如果直接調(diào)用run方法,程序只會(huì)按照順序執(zhí)行主線程這一個(gè)線程。不會(huì)創(chuàng)建一個(gè)線程。
public class HelloWorld { public static void main(String[] args) { // 創(chuàng)建線程t1 Thread t1 = new MyThread(); ① // 開始線程t1 t1.run(); } }
二、實(shí)現(xiàn)Runnable接口:
因?yàn)門hread類實(shí)現(xiàn)了Runnable接口,我們可以直接實(shí)現(xiàn)Runnable,然后通過Thread(Runnable target)來創(chuàng)建線程。
//線程執(zhí)行對(duì)象 public class Runner implements Runnable { // 編寫執(zhí)行線程代碼 @Override public void run() { } // 線程執(zhí)行結(jié)束 System.out.println("執(zhí)行完成! " + Thread.currentThread().getName()); } } public class HelloWorld { public static void main(String[] args) { // 創(chuàng)建線程t1,參數(shù)是一個(gè)線程執(zhí)行對(duì)象Runner Thread t1 = new Thread(new Runner()); // 開始線程t1 t1.start(); } }
注意: (1)實(shí)現(xiàn)Runnable接口,就不能調(diào)用Thread類的方法了,但是可以通過Thread.currentThread()進(jìn)行調(diào)用。
(2)可能有的人很好奇,thread.start();為什么調(diào)用我們實(shí)現(xiàn)Runnable類的run方法,而不是Thread類的run方法。這就要從源碼分析了:
//Thread的run方法,調(diào)用target.run() public void run() { if (target != null) { target.run(); } } //Thread的構(gòu)造器 public Thread(Runnable target) { init(null, target, "Thread-" + nextThreadNum(), 0); }
Thread類的構(gòu)造器會(huì)調(diào)用init方法,會(huì)把我們傳過去的Runnable對(duì)象賦值給Thread類的target,所以target.run()就是我們實(shí)現(xiàn)Runnable類,調(diào)用重寫的run方法。
private Runnable target;
二、比較創(chuàng)建線程的兩種方法:
開發(fā)中:優(yōu)先選擇,實(shí)現(xiàn)Runnable接口的方式
原因:(1)實(shí)現(xiàn)的方式?jīng)]有類的單繼承的局限性
(2)實(shí)現(xiàn)的方式更適合來處理多個(gè)線程共享數(shù)據(jù)的情況。
聯(lián)系: Thread實(shí)現(xiàn)了Runnable
相同點(diǎn): 兩者都需要重寫run()。
總結(jié):兩種方法各有好壞,所謂蘿卜青菜各有所愛,除了自身喜好,別忘了實(shí)際的應(yīng)用場(chǎng)景。(◔◡◔)
到此這篇關(guān)于Java創(chuàng)建子線程的兩種方法的文章就介紹到這了,更多相關(guān)Java創(chuàng)建子線程內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringMVC通過攔截器實(shí)現(xiàn)IP黑名單
這篇文章主要為大家詳細(xì)介紹了SpringMVC通過攔截器實(shí)現(xiàn)IP黑名單,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-08-08Java使用JavaMail API發(fā)送和接收郵件的代碼示例
JavaMail是Oracle甲骨文開發(fā)的Java郵件類API,支持多種郵件協(xié)議,這里我們就來看一下Java使用JavaMail API發(fā)送和接收郵件的代碼示例2016-06-06基于spring如何實(shí)現(xiàn)事件驅(qū)動(dòng)實(shí)例代碼
這篇文章主要給大家介紹了關(guān)于基于spring如何實(shí)現(xiàn)事件驅(qū)動(dòng)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用spring具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04Java結(jié)構(gòu)型設(shè)計(jì)模式之裝飾模式詳解
裝飾模式(Decorator Pattern)允許向一個(gè)現(xiàn)有的對(duì)象添加新的功能,同時(shí)又不改變其結(jié)構(gòu)。這種類型的設(shè)計(jì)模式屬于結(jié)構(gòu)型模式,它是作為現(xiàn)有類的一個(gè)包裝。這種模式創(chuàng)建了一個(gè)裝飾類,用來包裝原有的類,并在保持類方法簽名完整性的前提下,提供了額外的功能2023-03-03基于Spring Boot使用JpaRepository刪除數(shù)據(jù)時(shí)的注意事項(xiàng)
這篇文章主要介紹了Spring Boot使用JpaRepository刪除數(shù)據(jù)時(shí)的注意事項(xiàng),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06Java使用釘釘創(chuàng)建企業(yè)內(nèi)部機(jī)器人的實(shí)現(xiàn)
釘釘?shù)某霈F(xiàn)為企業(yè)節(jié)約了大量人力成本,其中也開放了大量的外部api接口方便企業(yè)使用。本文主要介紹了Java使用釘釘創(chuàng)建企業(yè)內(nèi)部機(jī)器人的實(shí)現(xiàn),感興趣的可以了解一下2021-11-11基于EasyExcel實(shí)現(xiàn)百萬級(jí)數(shù)據(jù)導(dǎo)入導(dǎo)出詳解
大數(shù)據(jù)的導(dǎo)入和導(dǎo)出,相信大家在日常的開發(fā)、面試中都會(huì)遇到。本文將為大家詳細(xì)介紹一下如何利用EasyExcel實(shí)現(xiàn)百萬級(jí)數(shù)據(jù)導(dǎo)入導(dǎo)出,需要的可以參考一下2023-01-01