国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

如何創(chuàng)建并運(yùn)行java線程

宋華 / 1253人閱讀

摘要:例子如下可以用如下方式創(chuàng)建并運(yùn)行上述子類(lèi)一旦線程啟動(dòng)后方法就會(huì)立即返回,而不會(huì)等待到方法執(zhí)行完畢才返回。但是,事實(shí)上方法并非是由剛創(chuàng)建的新線程所執(zhí)行的,而是被創(chuàng)建新線程的當(dāng)前線程所執(zhí)行了。這是因?yàn)榫€程是并行執(zhí)行而非順序的。

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

Tread thread = new Thread();

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

thread.start();

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

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

創(chuàng)建Thread的子類(lèi)

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

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

可以用如下方式創(chuàng)建并運(yùn)行上述Thread子類(lèi)

MyThread myThread = new MyThread();
myTread.start();

一旦線程啟動(dòng)后start方法就會(huì)立即返回,而不會(huì)等待到run方法執(zhí)行完畢才返回。就好像run方法是在另外一個(gè)cpu上執(zhí)行一樣。當(dāng)run方法執(zhí)行后,將會(huì)打印出字符串MyThread running。

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

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

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

實(shí)現(xiàn)Runnable接口

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

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

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

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

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

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

Runnable myRunnable = new Runnable(){
   public void run(){
     System.out.println("Runnable running");
   }
}
Thread thread = new Thread(myRunnable);
thread.start();
創(chuàng)建子類(lèi)還是實(shí)現(xiàn)Runnable接口?

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

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

常見(jiàn)錯(cuò)誤:調(diào)用run()方法而非start()方法

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

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

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

線程名

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

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

需要注意的是,因?yàn)镸yRunnable并非Thread的子類(lèi),所以MyRunnable類(lèi)并沒(méi)有g(shù)etName()方法。可以通過(guò)以下方式得到當(dāng)前線程的引用:

Thread.currentThread();

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

 String threadName = Thread.currentThread().getName();
線程代碼舉例:

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

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();
      }
  }
}

需要注意的是,盡管啟動(dòng)線程的順序是有序的,但是執(zhí)行的順序并非是有序的。也就是說(shuō),1號(hào)線程并不一定是第一個(gè)將自己名字輸出到控制臺(tái)的線程。這是因?yàn)榫€程是并行執(zhí)行而非順序的。Jvm和操作系統(tǒng)一起決定了線程的執(zhí)行順序,他和線程的啟動(dòng)順序并非一定是一致的。

原文 Creating and Starting Java Threads?
譯者 章筱虎 ?校對(duì) 方騰飛
via ifeve

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/64047.html

相關(guān)文章

  • JAVA線程發(fā)基礎(chǔ)面試問(wèn)答

    摘要:多線程和并發(fā)問(wèn)題是技術(shù)面試中面試官比較喜歡問(wèn)的問(wèn)題之一。線程可以被稱為輕量級(jí)進(jìn)程。一個(gè)守護(hù)線程是在后臺(tái)執(zhí)行并且不會(huì)阻止終止的線程。其他的線程狀態(tài)還有,和。上下文切換是多任務(wù)操作系統(tǒng)和多線程環(huán)境的基本特征。 多線程和并發(fā)問(wèn)題是 Java 技術(shù)面試中面試官比較喜歡問(wèn)的問(wèn)題之一。在這里,從面試的角度列出了大部分重要的問(wèn)題,但是你仍然應(yīng)該牢固的掌握J(rèn)ava多線程基礎(chǔ)知識(shí)來(lái)對(duì)應(yīng)日后碰到的問(wèn)題。(...

    dreamans 評(píng)論0 收藏0
  • JAVA線程發(fā)基礎(chǔ)

    摘要:線程可以被稱為輕量級(jí)進(jìn)程。一個(gè)守護(hù)線程是在后臺(tái)執(zhí)行并且不會(huì)阻止終止的線程。其他的線程狀態(tài)還有,和。上下文切換是多任務(wù)操作系統(tǒng)和多線程環(huán)境的基本特征。在的線程中并沒(méi)有可供任何對(duì)象使用的鎖和同步器。 原文:Java Multi-Threading and Concurrency Interview Questions with Answers 翻譯:并發(fā)編程網(wǎng) - 鄭旭東 校對(duì):方騰飛 多...

    vboy1010 評(píng)論0 收藏0
  • Java內(nèi)存模型

    摘要:內(nèi)存模型指定了如何與計(jì)算機(jī)內(nèi)存協(xié)同工作。內(nèi)部的內(nèi)存模型內(nèi)存模型在內(nèi)部使用,將內(nèi)存分為了線程棧和堆。下面的圖從邏輯角度給出了內(nèi)存模型每個(gè)運(yùn)行在內(nèi)部的線程都有自己的線程棧。部分線程棧和堆可能在某些時(shí)候會(huì)占用緩存和內(nèi)部寄存器。 Java內(nèi)存模型指定了JVM如何與計(jì)算機(jī)內(nèi)存協(xié)同工作。JVM是整個(gè)計(jì)算機(jī)的模型因此這個(gè)模型包含了內(nèi)存模型,也就是Java內(nèi)存模型。 如果你像要設(shè)計(jì)正確行為的并發(fā)程序,...

    fantix 評(píng)論0 收藏0
  • 想進(jìn)大廠?50個(gè)多線程面試題,你會(huì)多少?(一)

    摘要:下面是線程相關(guān)的熱門(mén)面試題,你可以用它來(lái)好好準(zhǔn)備面試。線程安全問(wèn)題都是由全局變量及靜態(tài)變量引起的。持有自旋鎖的線程在之前應(yīng)該釋放自旋鎖以便其它線程可以獲得自旋鎖。 最近看到網(wǎng)上流傳著,各種面試經(jīng)驗(yàn)及面試題,往往都是一大堆技術(shù)題目貼上去,而沒(méi)有答案。 不管你是新程序員還是老手,你一定在面試中遇到過(guò)有關(guān)線程的問(wèn)題。Java語(yǔ)言一個(gè)重要的特點(diǎn)就是內(nèi)置了對(duì)并發(fā)的支持,讓Java大受企業(yè)和程序員...

    wow_worktile 評(píng)論0 收藏0
  • 類(lèi)的加載機(jī)制

    摘要:如果沒(méi)有,那必須先執(zhí)行相應(yīng)的類(lèi)加載過(guò)程。分配內(nèi)存在類(lèi)加載檢查通過(guò)后,接下來(lái)虛擬機(jī)將為新生對(duì)象分配內(nèi)存。程序計(jì)數(shù)器主要有兩個(gè)作用字節(jié)碼解釋器通過(guò)改變程序計(jì)數(shù)器來(lái)依次讀取指令,從而實(shí)現(xiàn)代碼的流程控制,如順序執(zhí)行選擇循環(huán)異常處理。 目錄介紹 01.Java對(duì)象的創(chuàng)建過(guò)程 1.0 看下創(chuàng)建類(lèi)加載過(guò)程 1.1 對(duì)象的創(chuàng)建 1.2 對(duì)象的內(nèi)存布局 02.Java內(nèi)存區(qū)域 2.0 運(yùn)行...

    mikyou 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<