程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> java 線程創立多線程詳解

java 線程創立多線程詳解

編輯:關於JAVA

java 線程創立多線程詳解。本站提示廣大學習愛好者:(java 線程創立多線程詳解)文章只能為提供參考,不一定能成為您想要的結果。以下是java 線程創立多線程詳解正文


Java 線程類也是一個 object 類,它的實例都繼續自 java.lang.Thread 或其子類。 可以用以下方法用 java 中創立一個線程,履行該線程可以挪用該線程的 start()辦法:

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

在下面的例子中,我們並沒無為線程編寫運轉代碼,是以挪用該辦法後線程就終止了。

編寫線程運轉時履行的代碼有兩種方法:一種是創立 Thread 子類的一個實例偏重寫 run 辦法,第二種是創立類的時刻完成 Runnable 接口。接上去我們會詳細講授這兩種辦法:

創立 Thread 的子類

創立 Thread 子類的一個實例偏重寫 run 辦法,run 辦法會在挪用 start()辦法以後被履行。可以用以下方法創立並運轉上述 Thread 子類例子以下:

public class MyThread extends Thread {
  public void run(){
   System.out.println("MyThread running");
  }
}
MyThread myThread = new MyThread();
myTread.start();

一旦線程啟動後 start 辦法就會立刻前往,而不會期待到 run 辦法履行終了才前往。就似乎 run 辦法是在別的一個 cpu 上履行一樣。當 run 辦法履行後,將會打印出字符串 MyThread running。

你也能夠以下創立一個 Thread 的匿名子類:

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

當新的線程的 run 辦法履行今後,盤算機將會打印出字符串”Thread Running”。

完成 Runnable 接口

第二種編寫線程履行代碼的方法是新建一個完成了 java.lang.Runnable 接口的類的實例,實例中的辦法可以被線程挪用。上面給出例子:

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

為了使線程可以或許履行 run()辦法,須要在 Thread 類的結構函數中傳入 MyRunnable 的實例對象。示例以下:

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

當線程運轉時,它將會挪用完成了 Runnable 接口的 run 辦法。上例中將會打印出”MyRunnable running”。

異樣,也能夠創立一個完成了 Runnable 接口的匿名類,以下所示:

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

創立子類照樣完成 Runnable 接口?

關於這兩種方法哪一種好並沒有一個肯定的謎底,它們都能知足請求。就我小我看法,我更偏向於完成 Runnable 接口這類辦法。由於線程池可以有用的治理完成了 Runnable 接口的線程,假如線程池滿了,新的線程就會列隊等待履行,直到線程池余暇出來為止。而假如線程是經由過程完成 Thread 子類完成的,這將會龐雜一些。

有時我們要同時融會完成 Runnable 接口和 Thread 子類兩種方法。例如,完成了 Thread 子類的實例可以履行多個完成了 Runnable 接口的線程。一個典范的運用就是線程池。

罕見毛病:挪用 run()辦法而非 start()辦法

創立並運轉一個線程所犯的罕見毛病是挪用線程的 run()辦法而非 start()辦法,以下所示:

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

起先你其實不會感到到有甚麼不當,由於 run()辦法切實其實如你所願的被挪用了。然則,現實上,run()辦法並不是是由剛創立的新線程所履行的,而是被創立新線程確當前哨程所履行了。也就是被履行下面兩行代碼的線程所履行的。想要讓創立的新線程履行 run()辦法,必需挪用新線程的 start 辦法。

線程名

當創立一個線程的時刻,可以給線程起一個名字。它有助於我們辨別分歧的線程。例如:假如有多個線程寫入 System.out,我們就可以夠經由過程線程名輕易的找出是哪一個線程正在輸入。例子以下:

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

須要留意的是,由於 MyRunnable 並不是 Thread 的子類,所以 MyRunnable 類並沒有 getName()辦法。可以經由過程以下方法獲得以後線程的援用:

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

線程代碼舉例:

這裡是一個小小的例子。起首輸入履行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();
   }
 }
}

須要留意的是,雖然啟動線程的次序是有序的,然則履行的次序並不是是有序的。也就是說,1 號線程其實不必定是第一個將本身名字輸入到掌握台的線程。這是由於線程是並行履行而非次序的。Jvm 和操作體系一路決議了線程的履行次序,他和線程的啟動次序並不是必定是分歧的。

以上就是對Java 線程創立的材料整頓,後續持續彌補相干材料,感謝年夜家對本站的支撐!

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved