1. 程式人生 > >java基礎-JAVA之多執行緒

java基礎-JAVA之多執行緒

------<a href="http://www.itheima.com" target="blank">Java培訓、Android培訓、iOS培訓、.Net培訓</a>、期待與您交流! -------

要想了解執行緒,先了解程序的概念程序:

程序:是一個正在執行中的程式。每一個程序執行都有一個執行順序,該順序是一個執行路徑,或者叫一個控制單元。

1、執行緒的概念:

執行緒:就是程序中的一個獨立的控制單元,執行緒在控制著程序的執行;一個程序中至少有一個執行緒。

java中要想實現多執行緒,有兩種手段,

一種是繼續Thread類,另外一種是實現Runable介面。

通過繼承Thread類來建立執行緒的方法。類Thread1宣告為Thread的子類,它的構造方法定義執行緒名和起始引數。 

程式如下:

public class Thread1 extends Thread { 
     int k=0; 
     public Thread1(String name,int k)     { 
          super(name);         
           this.k = k;     } 
            public void run()                        //覆蓋run方法的執行緒體
             int i = k; 
           System.out.println(); 
           System.out.print(getName()+":  ");         while (i<50)         { 
            System.out.print(i+"  ");           
              i+=2;         } 
             System.out.println(getName() +"  end!");     } 
              public static void main (String args[])     { 
            Thread1 t1 = new Thread1("Thread1",1);     //建立執行緒物件       
              Thread1 t2 = new Thread1("Thread2",2);
               t1.start();                                //啟動執行執行緒     
               t2.start();
              System.out.println("activeCount="+t2.activeCount());     } }

2、建立執行緒的步驟: 

      1.定義一個類實現Runnable介面,重寫介面中的run()方法。在run()方法中加入具體的任務程式碼或處理邏輯。 

       2.建立Runnable介面實現類的物件。 

       3.建立一個Thread類的物件,需要封裝前面Runnable介面實現類的物件。(介面可以實現多繼承) 

       4.呼叫Thread物件的start()方法,啟動執行緒 

public class Thread1 extends Thread 
{ 
   int k=0; 
   public Thread1(String name,int k) 
   { 

     super(name); 
     this.k = k; 
  } 
 
public void run() 
 }
3、執行緒的四種狀態:

 

新狀態: 一個新產生的執行緒從新狀態開始了它的生命週期。它保持這個狀態知道程式start這個執行緒。

執行狀態:當一個新狀態的執行緒被start以後,執行緒就變成可執行狀態,一個執行緒在此狀態下被認為是開始執行其任務

就緒狀態:當一個執行緒等待另外一個執行緒執行一個任務的時候,該執行緒就進入就緒狀態。當另一個執行緒給就緒狀態的執行緒傳送訊號時,該執行緒才重新切換到執行狀態。

休眠狀態: 由於一個執行緒的時間片用完了,該執行緒從執行狀態進入休眠狀態。當時間間隔到期或者等待的時間發生了,該狀態的執行緒切換到執行狀態。

終止狀態: 一個執行狀態的執行緒完成任務或者其他終止條件發生,該執行緒就切換到終止狀態。

4、執行緒的使用:

4.1、建立一個執行緒,最簡單的方法是建立一個實現Runnable介面的類一個建立執行緒並開始讓它執行的例項:

// 建立一個新的執行緒
class NewThread implements Runnable {
   Thread t;
   NewThread() {
      // 建立第二個新執行緒
      t = new Thread(this, "Demo Thread");
      System.out.println("Child thread: " + t);
      t.start(); // 開始執行緒
   }
  
   // 第二個執行緒入口
   public void run() {
      try {
         for(int i = 5; i > 0; i--) {
            System.out.println("Child Thread: " + i);
            // 暫停執行緒
            Thread.sleep(50);
         }
     } catch (InterruptedException e) {
         System.out.println("Child interrupted.");
     }
     System.out.println("Exiting child thread.");
   }
}
 
public class ThreadDemo {
   public static void main(String args[]) {
      new NewThread(); // 建立一個新執行緒
      try {
         for(int i = 5; i > 0; i--) {
           System.out.println("Main Thread: " + i);
           Thread.sleep(100);
         }
      } catch (InterruptedException e) {
         System.out.println("Main thread interrupted.");
      }
      System.out.println("Main thread exiting.");
   }
}
執行結果如下:
Child thread: Thread[Demo Thread,5,main]
Main Thread: 5
Child Thread: 5
Child Thread: 4
Main Thread: 4
Child Thread: 3
Child Thread: 2
Main Thread: 3
Child Thread: 1
Exiting child thread.
Main Thread: 2
Main Thread: 1
Main thread exiting.

4.2、通過繼承Thread來建立執行緒:

建立一個執行緒的第二種方法是建立一個新的類,該類繼承Thread類,然後建立一個該類的例項。

繼承類必須重寫run()方法,該方法是新執行緒的入口點。它也必須呼叫start()方法才能執行。

// 通過繼承 Thread 建立執行緒
class NewThread extends Thread {
   NewThread() {
      // 建立第二個新執行緒
      super("Demo Thread");
      System.out.println("Child thread: " + this);
      start(); // 開始執行緒
   }
 
   // 第二個執行緒入口
   public void run() {
      try {
         for(int i = 5; i > 0; i--) {
            System.out.println("Child Thread: " + i);
                            // 讓執行緒休眠一會
            Thread.sleep(50);
         }
      } catch (InterruptedException e) {
         System.out.println("Child interrupted.");
      }
      System.out.println("Exiting child thread.");
   }
}
 
public class ExtendThread {
   public static void main(String args[]) {
      new NewThread(); // 建立一個新執行緒
      try {
         for(int i = 5; i > 0; i--) {
            System.out.println("Main Thread: " + i);
            Thread.sleep(100);
         }
      } catch (InterruptedException e) {
         System.out.println("Main thread interrupted.");
      }
      System.out.println("Main thread exiting.");
   }
}

編譯以上程式執行結果如下:
Child thread: Thread[Demo Thread,5,main]
Main Thread: 5
Child Thread: 5
Child Thread: 4
Main Thread: 4
Child Thread: 3
Child Thread: 2
Main Thread: 3
Child Thread: 1
Exiting child thread.
Main Thread: 2
Main Thread: 1
Main thread exiting.
5、多執行緒

有效利用多執行緒的關鍵是理解程式是併發執行而不是序列執行的。例如:程式中有兩個子系統需要併發執行,這時候就需要利用多執行緒程式設計。

通過對多執行緒的使用,可以編寫出非常高效的程式。不過請注意,如果建立太多的執行緒,程式執行的效率實際上是降低了,而不是提升了。

其中上下文的切換開銷也很重要,如果建立了太多的執行緒,CPU花費在上下文的切換的時間將多於執行程式的時間!

// 檔名 : DisplayMessage.java
// 通過實現 Runnable 介面建立執行緒
public class DisplayMessage implements Runnable
{
   private String message;
   public DisplayMessage(String message)
   {
      this.message = message;
   }
   public void run()
   {
      while(true)
      {
         System.out.println(message);
      }
   }
}
// 檔名 : GuessANumber.java
// 通過繼承 Thread 類建立執行緒

public class GuessANumber extends Thread
{
   private int number;
   public GuessANumber(int number)
   {
      this.number = number;
   }
   public void run()
   {
      int counter = 0;
      int guess = 0;
      do
      {
          guess = (int) (Math.random() * 100 + 1);
          System.out.println(this.getName()
                       + " guesses " + guess);
          counter++;
      }while(guess != number);
      System.out.println("** Correct! " + this.getName()
                       + " in " + counter + " guesses.**");
   }
}
// 檔名 : ThreadClassDemo.java
public class ThreadClassDemo
{
   public static void main(String [] args)
   {
      Runnable hello = new DisplayMessage("Hello");
      Thread thread1 = new Thread(hello);
      thread1.setDaemon(true);
      thread1.setName("hello");
      System.out.println("Starting hello thread...");
      thread1.start();
     
      Runnable bye = new DisplayMessage("Goodbye");
      Thread thread2 = new Thread(bye);
      thread2.setPriority(Thread.MIN_PRIORITY);
      thread2.setDaemon(true);
      System.out.println("Starting goodbye thread...");
      thread2.start();
 
      System.out.println("Starting thread3...");
      Thread thread3 = new GuessANumber(27);
      thread3.start();
      try
      {
         thread3.join();
      }catch(InterruptedException e)
      {
         System.out.println("Thread interrupted.");
      }
      System.out.println("Starting thread4...");
      Thread thread4 = new GuessANumber(75);
     
           thread4.start();
      System.out.println("main() is ending...");
   }
}

執行結果如下,每一次執行的結果都不一樣。
Starting hello thread...
Starting goodbye thread...
Hello
Hello
Hello
Hello
Hello
Hello
Hello
Hello
Hello
Thread-2 guesses 27
Hello
** Correct! Thread-2 in 102 guesses.**
Hello
Starting thread4...
Hello
Hello
..........remaining result produced.

6、synchronized:

格式:
synchronized(物件)
{
需要同步的程式碼;
}

格式:
在函式上加上synchronized修飾符即可。


同步可以解決安全問題的根本原因就在那個物件上。
該物件如同鎖的功能。

6.1、同步特點: 

前提:多個執行緒 

解決問題注意:多個執行緒使用的是同一個鎖物件

6.2、同步好處: 

同步解決了多執行緒的安全問題

6.3、同步的弊端: 

當執行緒很多時,因為每個執行緒都會去判斷同步上的鎖,很消耗資源,降低程式的執行效率

 

相關推薦

Java基礎加強執行篇 - 執行建立與終止、互斥、通訊、本地變數

執行緒建立與終止 執行緒建立 Thread類與 Runnable 介面的關係 public interface Runnable { public abstract void run(); } public class Thread implements Run

黑馬程式設計師——java基礎拾遺執行(二) 執行同步、執行通訊

執行緒安全的概念:當多個執行緒同時執行一段程式碼時,如果結果和單執行緒執行時一致,而且其他變數也和預期的一致,說明是這段程式碼是執行緒安全的。但是,多執行緒執行的過程中會出現單執行緒時候不會出現的問題,大多出現在多個執行緒同時操作全域性變數或者靜態變數的時候。當出現這種

Java基礎筆記執行

1.    執行緒在程式中是獨立的,併發的執行流。當程序被初始化後,主執行緒就建立了。 2.    多執行緒程式設計的優點: 程序之間不能共享記憶體,但執行緒之間共享記憶體非常容易。 系統建立程序時需要為該程序重新分配系統資源,但建立執行緒則代價小得多,因此使用多執行緒來

Java學習筆記——執行

多執行緒程式設計 程式: 程序:一個程式執行就會產生一個程序 執行緒:程序的執行流程,一個程序至少有一個執行緒,稱為主執行緒 如:QQ聊著天,同時在聽音樂 一個程序可以有多個執行緒,多個執行緒共享同一個程序的資源 執行緒類:Tread 多執行緒程式設計: 方式一:繼承Thread (1)&n

java基礎知識總結--執行

1、擴充套件Java.lang.Thread類 1.1、程序和執行緒的區別:        程序:每個程序都有自己獨立的程式碼和資料空間(程序上下文),程序間的切換會有較大的開銷,一個程序包含1~n個執行緒。    

java高階特性執行

java多執行緒知識點: 1、建立分執行緒的方式 2、單例模式懶漢式執行緒安全問題 3、java執行緒同步 4、java執行緒通訊 5、java的記憶體模型 認識執行緒: 每一個java程式都有一個隱含的主執行緒,即main()方法。 程式–&g

Java基礎 實驗六 執行

一、實驗內容     在一個執行緒中求100以內素數,求出後休眠一個隨機時間。在另一執行緒中求100以內能被3整除的數,求出後休眠一個隨機時間。輸出資料時應有提示,指明哪個執行緒輸出的資料。 二、實驗程式碼 1、NewOneThread.java packag

Java網路程式設計執行Client-Server

前面廢話過了,現在就直接看程式碼吧! ThreadedClient.java package exercise01; import java.io.*; import java.net.*; public class ThreadedClient { privat

Java基礎執行及併發庫

實際上關於多執行緒的基礎知識,前面自己已經總結過一部分,但是每一個階段對於同樣知識點的學習側重點是不一樣的,前面的Java基礎總結八之多執行緒(一)和 Java基礎總結九之多執行緒(二)是對JDK5以前多執行緒相關基礎知識的一個簡單總結,今天本文將偏重於JDK5提供的併發庫進行學習總結。 首先,

黑馬程式設計師----Java基礎執行

------- <a href="http://www.itheima.com" target="blank">android培訓</a>、<a href="http://www.itheima.com" target="blank">java培訓</a&g

【紮實基本功】Java基礎教程系列執行

1. 多執行緒的概念 1.1 程序、執行緒、多程序的概念 程序:正在進行中的程式(直譯)。 執行緒是程式執行的一條路徑, 一個程序中可以包含多條執行緒。 一個應用程式可以理解成就是一個程序。 多執行緒併發執行可以提高程式的效率, 可以同時完成多項工作。 1.

Java基礎執行-生產消費

使用場景請看上一篇部落格Java基礎之多執行緒-多生產多消費 話不多說,直接上程式碼: 顧客: package cn.itcast.day07.demo02; public class MultiConsumer implements Runnable { priva

Java基礎執行案例-單生產單消費

在講單生產單消費之前,我們先來說一下執行緒間通訊的問題 一、 執行緒間通訊 概念:多個執行緒在處理同一個資源,但是處理的動作(執行緒的任務)卻不相同。 比如:執行緒A用來生成包子的,執行緒B用來吃包子的,包子可以理解為同一資源,執行緒A與執行緒B處理的動作,一個是生產,一個是消費,

Java基礎執行原理、實現方式及匿名內部類建立執行方法

一、概念 程序:作業系統當中正在執行的一個程式。例如正在執行一個QQ。 執行緒:程序之內多工的執行單位。例如迅雷當中正在下載的多個電影。 JVM當中:棧(Stack)記憶體是執行緒獨立的,堆(Heap)記憶體是執行緒共享的。 (1)Java程式執行的時候至少有兩個執行緒: 1)主

sincerit java基礎執行

執行緒狀態 Java執行緒具有五中基本狀態 新建狀態(New):當執行緒物件對建立後,即進入了新建狀態,如:Thread t = new MyThread(); 就緒狀態(Runnable):當呼叫執行緒物件的start()方法(t.start();),執行緒即進入就緒狀態。處於就

Java基礎執行

以下是我們Java基礎多執行緒的一些知識點總結: 執行緒中run()和start()的區別:   對於Thread物件來說,當你呼叫的是start(),執行緒會被放到等待佇列,等待CPU排程,不一定馬上執行;無需等待run()方法執行完畢,可以直接執行下面的程式碼; 而呼叫的是run()的話,就是當做普通的方

Java基礎複習一執行(併發,記憶體模型)

前言:畢業來北京轉眼一年半了,但是沒有太多的成績。沒有太多的記錄和沉澱。現在開始複習一下基礎的知識。涉及到的有多執行緒,集合,JVM,NIO,資料庫,作業系統。後面還是想走實時處理那一塊,可能會有那方面的研究。 多執行緒:為啥用?因為想去執行不同的任務,或利用現狀多核的處

java基礎——執行

程式碼體現: public class MyThread extends Thread { public void run() { for(int x=0; x<100; x++) { System.out.println(getName()+"--

java基礎-JAVA執行

------<a href="http://www.itheima.com" target="blank">Java培訓、Android培訓、iOS培訓、.Net培訓</a>、期待與您交流! ------- 要想了解執行緒,先了解程序的概念程序: 程

Java基礎學習筆記執行

Java基礎之多執行緒 1.程序與執行緒 1)程序和執行緒都是一個時間段的描述,是CPU工作時間段的描述。 程序與執行緒都能夠完成多工 你打開了QQ,你開了一個程序,你打開了微信,你又開了一個程序,在QQ的這個程序裡,你與一個人的聊天開一個執行緒,