欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java創(chuàng)建并運行線程的方法

 更新時間:2021年01月08日 10:34:11   作者:無才的小易  
這篇文章主要介紹了Java創(chuàng)建并運行線程的方法,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下

Java線程類也是一個object類,它的實例都繼承自java.lang.Thread或其子類。 可以用如下方式用java中創(chuàng)建一個線程:

Tread thread = new Thread();

執(zhí)行該線程可以調(diào)用該線程的start()方法:

thread.start();

在上面的例子中,我們并沒有為線程編寫運行代碼,因此調(diào)用該方法后線程就終止了。

編寫線程運行時執(zhí)行的代碼有兩種方式:一種是創(chuàng)建Thread子類的一個實例并重寫run方法,第二種是創(chuàng)建類的時候?qū)崿F(xiàn)Runnable接口。接下來我們會具體講解這兩種方法:

創(chuàng)建Thread****的子類

創(chuàng)建Thread子類的一個實例并重寫run方法,run方法會在調(diào)用start()方法之后被執(zhí)行。例子如下:

public class MyThread extends Thread {
 public void run(){
  System.out.println("MyThread running");
 }
 }

可以用如下方式創(chuàng)建并運行上述Thread子類

MyThread myThread = new MyThread();

myTread.start();

你也可以如下創(chuàng)建一個Thread的匿名子類:一旦線程啟動后start方法就會立即返回,而不會等待到run方法執(zhí)行完畢才返回。就好像run方法是在另外一個cpu上執(zhí)行一樣。當(dāng)run方法執(zhí)行后,將會打印出字符串MyThread running。

你也可以如下創(chuàng)建一個Thread的匿名子類:

Thread thread = new Thread(){
 public void run(){
 System.out.println("Thread Running");
 }
};
thread.start();

當(dāng)新的線程的run方法執(zhí)行以后,計算機將會打印出字符串”Thread Running”。

實現(xiàn)Runnable****接口

第二種編寫線程執(zhí)行代碼的方式是新建一個實現(xiàn)了java.lang.Runnable接口的類的實例,實例中的方法可以被線程調(diào)用。下面給出例子:

public class MyRunnable implements Runnable {

public void run(){
 System.out.println("MyRunnable running");
  }
}

為了使線程能夠執(zhí)行run()方法,需要在Thread類的構(gòu)造函數(shù)中傳入 MyRunnable的實例對象。示例如下:

Thread thread = new Thread(new MyRunnable());
thread.start();

當(dāng)線程運行時,它將會調(diào)用實現(xiàn)了Runnable接口的run方法。上例中將會打印出”MyRunnable running”。

同樣,也可以創(chuàng)建一個實現(xiàn)了Runnable接口的匿名類,如下所示:

Runnable myRunnable = new Runnable(){
 public void run(){
 System.out.println("Runnable running");
 }
}
Thread thread = new Thread(myRunnable);
thread.start();

創(chuàng)建子類還是實現(xiàn)Runnable接口?

有時我們要同時融合實現(xiàn)Runnable接口和Thread子類兩種方式。例如,實現(xiàn)了Thread子類的實例可以執(zhí)行多個實現(xiàn)了Runnable接口的線程。一個典型的應(yīng)用就是線程池。

對于這兩種方式哪種好并沒有一個確定的答案,它們都能滿足要求。就我個人意見,我更傾向于實現(xiàn)Runnable接口這種方法。因為線程池可以有效的管理實現(xiàn)了Runnable接口的線程,如果線程池滿了,新的線程就會排隊等候執(zhí)行,直到線程池空閑出來為止。而如果線程是通過實現(xiàn)Thread子類實現(xiàn)的,這將會復(fù)雜一些。

**常見錯誤:調(diào)用run()****方法而非start()**方法

創(chuàng)建并運行一個線程所犯的常見錯誤是調(diào)用線程的run()方法而非start()方法,如下所示:

Thread newThread = new Thread(MyRunnable());
newThread.run(); //should be start();

當(dāng)創(chuàng)建一個線程的時候,可以給線程起一個名字。它有助于我們區(qū)分不同的線程。例如:如果有多個線程寫入System.out,我們就能夠通過線程名容易的找出是哪個線程正在輸出。例子如下:**

線程名**起初你并不會感覺到有什么不妥,因為run()方法的確如你所愿的被調(diào)用了。但是,事實上,run()方法并非是由剛創(chuàng)建的新線程所執(zhí)行的,而是被創(chuàng)建新線程的當(dāng)前線程所執(zhí)行了。也就是被執(zhí)行上面兩行代碼的線程所執(zhí)行的。想要讓創(chuàng)建的新線程執(zhí)行run()方法,必須調(diào)用新線程的start方法。

MyRunnable runnable = new MyRunnable();
Thread thread = new Thread(runnable, "New Thread");
thread.start();
System.out.println(thread.getName());

需要注意的是,因為MyRunnable并非Thread的子類,所以MyRunnable類并沒有g(shù)etName()方法。可以通過以下方式得到當(dāng)前線程的引用:

Thread.currentThread();

因此,通過如下代碼可以得到當(dāng)前線程的名字:

String threadName = Thread.currentThread().getName();

線程代碼舉例:

這里是一個小小的例子。首先輸出執(zhí)行main()方法線程名字。這個線程JVM分配的。然后開啟10個線程,命名為1~10。每個線程輸出自己的名字后就退出。

public class ThreadExample {
 public static void main(String[] args){
 System.out.println(Thread.currentThread().getName());
 for(int i=0; i<10; i++){
  new Thread("" + i){
  public void run(){
  System.out.println("Thread: " + getName() + "running");
  }
  }.start();
  }
 }
}

需要注意的是,盡管啟動線程的順序是有序的,但是執(zhí)行的順序并非是有序的。也就是說,1號線程并不一定是第一個將自己名字輸出到控制臺的線程。這是因為線程是并行執(zhí)行而非順序的。Jvm和操作系統(tǒng)一起決定了線程的執(zhí)行順序,他和線程的啟動順序并非一定是一致的。

到此這篇關(guān)于Java創(chuàng)建并運行線程的方法的文章就介紹到這了,更多相關(guān)Java創(chuàng)建并運行線程內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Spring Cloud Ribbon客戶端詳細介紹

    Spring Cloud Ribbon客戶端詳細介紹

    Spring Cloud Ribbon 是一套基于 Netflix Ribbon 實現(xiàn)的客戶端負載均衡和服務(wù)調(diào)用工具。通過Spring Cloud的封裝,可以讓我們輕松地將面向服務(wù)的REST模版請求自動轉(zhuǎn)換成客戶端負載均衡的服務(wù)調(diào)用
    2022-09-09
  • java RocketMQ快速入門基礎(chǔ)知識

    java RocketMQ快速入門基礎(chǔ)知識

    這篇文章主要介紹了java RocketMQ快速入門基礎(chǔ)知識,所以RocketMQ是站在巨人的肩膀上(kafka),又對其進行了優(yōu)化讓其更滿足互聯(lián)網(wǎng)公司的特點。它是純Java開發(fā),具有高吞吐量、高可用性、適合大規(guī)模分布式系統(tǒng)應(yīng)用的特點。,需要的朋友可以參考下
    2019-06-06
  • 詳解spring boot配置 ssl

    詳解spring boot配置 ssl

    本篇文章主要介紹了詳解spring boot配置 ssl,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-05-05
  • Java 并發(fā)編程:volatile的使用及其原理解析

    Java 并發(fā)編程:volatile的使用及其原理解析

    下面小編就為大家?guī)硪黄狫ava 并發(fā)編程:volatile的使用及其原理解析。小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-05-05
  • java驗證電話號碼的方法

    java驗證電話號碼的方法

    這篇文章主要介紹了java驗證電話號碼的方法,需要的朋友可以參考下
    2014-02-02
  • Java常用數(shù)字工具類 數(shù)字轉(zhuǎn)漢字(1)

    Java常用數(shù)字工具類 數(shù)字轉(zhuǎn)漢字(1)

    這篇文章主要為大家詳細介紹了Java常用數(shù)字工具類,數(shù)字轉(zhuǎn)漢字,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • 一文搞懂java中的棧和括號匹配

    一文搞懂java中的棧和括號匹配

    棧在我們?nèi)粘>幋a中遇到的非常多,很多人對棧的接觸可能僅僅局限在?遞歸使用的棧?和?StackOverflowException,棧是一種后進先出的數(shù)據(jù)結(jié)構(gòu)(可以想象生化金字塔的牢房和生化角斗場的狗洞)
    2023-11-11
  • 使用java判斷輸入年份是否為閏年完整代碼

    使用java判斷輸入年份是否為閏年完整代碼

    閏年的引入確保了我們的日歷與地球運行軌道的對齊,使得時間的計算更加準確,在編程中判斷給定年份是否為閏年是一項常見的任務(wù),這篇文章主要給大家介紹了關(guān)于使用java判斷輸入年份是否為閏年的相關(guān)資料,需要的朋友可以參考下
    2023-10-10
  • Java正則表達式之Pattern和Matcher的使用

    Java正則表達式之Pattern和Matcher的使用

    本文詳細介紹了Java中處理正則表達式的Pattern和Matcher類的使用方法和實例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-09-09
  • Hystrix?Turbine聚合監(jiān)控的實現(xiàn)詳解

    Hystrix?Turbine聚合監(jiān)控的實現(xiàn)詳解

    微服務(wù)架構(gòu)下,?個微服務(wù)往往部署多個實例,如果每次只能查看單個實例的監(jiān)控,就需要經(jīng)常切換很不?便,在這樣的場景下,我們可以使??Hystrix?Turbine?進?聚合監(jiān)控,它可以把相關(guān)微服務(wù)的監(jiān)控數(shù)據(jù)聚合在?起,便于查看
    2022-09-09

最新評論