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

舉例講授Java中的多線程編程

編輯:關於JAVA

舉例講授Java中的多線程編程。本站提示廣大學習愛好者:(舉例講授Java中的多線程編程)文章只能為提供參考,不一定能成為您想要的結果。以下是舉例講授Java中的多線程編程正文


Java創立線程(Runnable接口和Thread類)
年夜多半情形,經由過程實例化一個Thread對象來創立一個線程。Java界說了兩種方法:

  1. 完成Runnable 接口;
  2. 可以繼續Thread類。
  3. 上面的順次引見了每種方法。
    完成Runnable接口

    創立線程的最簡略的辦法就是創立一個完成Runnable 接口的類。Runnable籠統了一個履行代碼單位。你可以經由過程完成Runnable接口的辦法創立每個對象的線程。為完成Runnable 接口,一個類僅需完成一個run()的簡略辦法,該辦法聲明以下:

      public void run( )


    在run()中可以界說代碼來構建新的線程。懂得上面內容是相當主要的:run()辦法可以或許像主線程那樣挪用其他辦法,援用其他類,聲明變量。唯一的分歧是run()在法式中確立另外一個並發的線程履行進口。當run()前往時,該線程停止。

    在你曾經創立了完成Runnable接口的類今後,你要在類外部實例化一個Thread類的對象。Thread 類界說了好幾種結構函數。我們會用到的以下:

      Thread(Runnable threadOb, String threadName)


    該結構函數中,threadOb是一個完成Runnable接口類的實例。這界說了線程履行的終點。新線程的稱號由threadName界說。

    樹立新的線程後,它其實不運轉直到挪用了它的start()辦法,該辦法在Thread 類中界說。實質上,start() 履行的是一個對run()的挪用。 Start()辦法聲明以下:

      void start( )

    上面的例子是創立一個新的線程並啟動它運轉:

    // Create a second thread.
    class NewThread implements Runnable {
      Thread t;
      NewThread() {
        // Create a new, second thread
        t = new Thread(this, "Demo Thread");
        System.out.println("Child thread: " + t);
        t.start(); // Start the thread
      }
    
      // This is the entry point for the second thread.
      public void run() {
        try {
          for(int i = 5; i > 0; i--) {
            System.out.println("Child Thread: " + i);
            Thread.sleep(500);
          }
        } catch (InterruptedException e) {
          System.out.println("Child interrupted.");
        }
        System.out.println("Exiting child thread.");
      }
    }
    
    class ThreadDemo {
      public static void main(String args[]) {
        new NewThread(); // create a new thread
        try {
          for(int i = 5; i > 0; i--) {
            System.out.println("Main Thread: " + i);
            Thread.sleep(1000);
          }
        } catch (InterruptedException e) {
          System.out.println("Main thread interrupted.");
        }
        System.out.println("Main thread exiting.");
      }
    }
    
    

    在NewThread 結構函數中,新的Thread對象由上面的語句創立::

      t = new Thread(this, "Demo Thread");


    經由過程後面的語句this 注解在this對象中你想要新的線程挪用run()辦法。然後,start() 被挪用,以run()辦法為開端啟動了線程的履行。這使子線程for 輪回開端履行。挪用start()以後,NewThread 的結構函數前往到main()。當主線程被恢復,它達到for 輪回。兩個線程持續運轉,同享CPU,直到它們的輪回停止。該法式的輸入以下:

    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.
    

    如後面提到的,在多線程法式中,平日主線程必需是停止運轉的最初一個線程。現實上,一些老的JVM,假如主線程先於子線程停止,Java的運轉時光體系便可能“掛起”。前述法式包管了主線程最初停止,由於主線程覺醒周期1000毫秒,而子線程僅為500毫秒。這就使子線程在主線程停止之前先停止。簡而言之,你將看到期待線程停止的更好門路。
    擴大Thread

    創立線程的另外一個門路是創立一個新類來擴大Thread類,然後創立該類的實例。當一個類繼續Thread時,它必需重載run()辦法,這個run()辦法是新線程的進口。它也必需挪用start()辦法去啟動新線程履行。上面用擴大thread類重寫後面的法式:

    // Create a second thread by extending Thread
    class NewThread extends Thread {
      NewThread() {
        // Create a new, second thread
        super("Demo Thread");
        System.out.println("Child thread: " + this);
        start(); // Start the thread
      }
    
      // This is the entry point for the second thread.
      public void run() {
        try {
          for(int i = 5; i > 0; i--) {
            System.out.println("Child Thread: " + i);
            Thread.sleep(500);
          }
        } catch (InterruptedException e) {
          System.out.println("Child interrupted.");
        }
        System.out.println("Exiting child thread.");
      }
    }
    
    class ExtendThread {
      public static void main(String args[]) {
        new NewThread(); // create a new thread
        try {
          for(int i = 5; i > 0; i--) {
            System.out.println("Main Thread: " + i);
            Thread.sleep(1000);
          }
        } catch (InterruptedException e) {
          System.out.println("Main thread interrupted.");
        }
        System.out.println("Main thread exiting.");
      }
    }
    
    

    該法式生成和前述版原形同的輸入。子線程是由實例化NewThread對象生成的,該對象從Thread類派生。留意NewThread 中super()的挪用。該辦法挪用了以下情勢的Thread結構函數:

      public Thread(String threadName)


    這裡,threadName指定線程稱號。
    選擇適合辦法

    到這裡,你必定會奇異為何Java有兩種創立子線程的辦法,哪種更好呢。一切的成績都歸於一點。Thread類界說了多種辦法可以被派生類重載。關於一切的辦法,唯一的必需被重載的是run()辦法。這固然是完成Runnable接口所需的異樣的辦法。許多Java法式員以為類僅在它們被增強或修正時應當被擴大。是以,假如你不重載Thread的其他辦法時,最好只完成Runnable 接口。這固然由你決議。但是,在本章的其他部門,我們運用完成runnable接口的類來創立線程。

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