Java多線程3—線程的調度和runnable接口優點

Java運行時系統實現了一個用於調度線程執行的線程調度器,用於確定某一時刻由哪一個線程在CPU上運行。在java技術中,線程通常是搶佔式的而不需要時間片分配進程(分配給每個線程相等的CPU時間的進程)。搶佔式調度模型就是許多線程處於可以運行狀態(等待狀態),但實際上只有一個線程在運行。該線程一直運行到它終止進入可運行狀態(等待狀態),或者另一個具有更高優先級的線程變成可運行狀態。在後一種情況下,低優先級的線程被高優先級的線程搶佔,高優先級的線程獲得運行的機會。

Java線程調度器支持不同優先級線程的搶先方式,但其本身不支持相同優先級線程的時間片輪換。Java運行時系統所在的操作系統(例如:Windows2000)支持時間片的輪換,則線程調度器就支持相同優先級線程的時間片輪換。下面我們寫一個例子程序簡單的介紹一下:

class MultiThread

{

   public static void main(String[] args)

   {

      MyThread mt=new MyThread();

      Threadt = newThread(mt);

t.start();

      while(true)

      {

         System.out.println("main:"+Thread.currentThread().getName());

      }

   }

}

 

class MyThreadimplementsRunnable//extends Thread

{

   public void run()

   {

      while(true)

      {

         System.out.println(Thread.currentThread().getName());

      }

   }

}

//Thread-0

Thread-0

Thread-0

Thread-0

main:main

main:main

main:main

main:main

        循環輸出結果,這裏兩個線程交替執行,但是並不是由於java虛擬機使其切換的,是由於操做系統的時間片原則,使兩個線程交替執行。如果我們希望改變線程的優先級,可以調用Thread類的setPriority()方法改變。這個方法需要一個參數,系統提供了幾個常量MAX_PRIORITY、MIX_PRIORITY我們在使用這個方法的時候需要傳遞其中一個參數。我們修改一下上面的代碼:

Thread t = new Thread(mt);

t.setPriority(MAX_PRIORITY);//加上這行代碼

t.start();

         這樣程序的執行結果就是一直執行Thread-0,在我們退出的時候纔會執行main:main。多說一句,一般情況下我們不去修改線程的優先級,而且線程的優先級的改變不一定在start()方法前,在線程啓動後,我們也可以根據需要改變線程的優先級。

       下面我們來說一下實現runnable接口的優勢,第一個優勢我上篇文章已經說了就不多說了,大家可以去http://blog.csdn.net/mengxiangyue/article/details/6865741看看。第二個優勢就是,如果我們的多個線程需要同時訪問相同的數據,如果我們繼承Thread類的話,就需要這個類創建的線程間的數據進行通信,但是如果我們實現runnable接口的話,就不用那麼做(這裏有點不對,並不是所有的實現runnable接口都不用通信)。下面我們用一個程序說明一下:

class MultiThread

{

   public static void main(String[] args)

   {

      MyThread mt=new MyThread();

      new Thread(mt).start();

      new Thread(mt).start();

      new Thread(mt).start();

      new Thread(mt).start();

      for(int i = 0;i<100;i++)

      {

         System.out.println("main:"+Thread.currentThread().getName());

      }

   }

}

 

class MyThreadimplementsRunnable//extends Thread

{

   int index=0;

      public void run()

      {

         for(int i = 0;i<100;i++)

         {

            System.out.println(Thread.currentThread().getName()+":"+index++);

         }

      } 

}

//Thread-0:0

Thread-3:3

main:main

Thread-2:2

Thread-1:1

Thread-2:6

main:main

Thread-3:5

Thread-0:4

Thread-3:9

main:main……

       結果是這四個線程輸出了從0到399,雖然順序不是按照1、2、3……這樣,但是也沒有問題,這個原因是因爲線程執行時候操做系統時間片調度原則產生的。如果你在你的PC上運行這段代碼,得到的結果也會不同。

         寫這個的時候明顯感到有的地方寫的不妥,希望大家指出。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章