執行緒和執行緒池的理解與java簡單例子

我是壞男孩發表於2016-11-23

1.執行緒

(1)理解,執行緒是系統分配處理器時間資源的基本單元也是系統呼叫的基本單位,簡單理解就是一個或多個執行緒組成了一個程式,程式就像爸爸,執行緒就像兒子,有時候爸爸一個人幹不了活就生了幾個兒子幹活,會比較快,例如你開啟視訊軟體線上看視訊,那有一個執行緒負責下載,一個執行緒負責播放...,視訊軟體就相當爸爸,執行緒就像兒子們,好處就是可以併發,效率高;

(2)執行緒一般有兩種方法,很簡單  下面例子懶得寫以前有參照過別人的 http://www.myexception.cn/program/1056162.html

2-1.繼承Thread執行緒類

class ThreadUseExtends extends Thread
//通過繼承Thread類,並實現它的抽象方法run()
//適當時候建立這一Thread子類的例項來實現多執行緒機制
//一個執行緒啟動後(也即進入就緒狀態)一旦獲得CPU將自動呼叫它的run()方法
{
      
      ThreadUseExtends(){}//建構函式
      public void run()
      {
              System.out.println("我是Thread子類的執行緒例項!");
              System.out.println("我將掛起10秒!");
              System.out.println("回到主執行緒,請稍等,剛才主執行緒掛起可能還沒醒過來!");
              try
              {
                      sleep(10000);//掛起10秒
              }
              catch (InterruptedException e)
              {
                      return;
              }
              //如果該run()方法順序執行完了,執行緒將自動結束,而不會被主執行緒殺掉
              //但如果休眠時間過長,則執行緒還存活,可能被stop()殺掉
      }
}

  2-2.實現 Runnable介面 程式碼簡單

class ThreadUseRunnable implements Runnable
//通過實現Runnable介面中的run()方法,再以這個實現了run()方法的類
//為引數建立Thread的執行緒例項
{
      //Thread thread2=new Thread(this);
      //以這個實現了Runnable介面中run()方法的類為引數建立Thread類的執行緒例項
      ThreadUseRunnable(){}//建構函式
      public void run()
      {
              System.out.println("我是Thread類的執行緒例項並以實現了Runnable介面的類為引數!");
              System.out.println("我將掛起1秒!");
              System.out.println("回到主執行緒,請稍等,剛才主執行緒掛起可能還沒醒過來!");
              try
              {
                      Thread.sleep(1000);//掛起1秒
              }
              catch (InterruptedException e)
              {
                      return;
              }
              //如果該run()方法順序執行完了,執行緒將自動結束,而不會被主執行緒殺掉
              //但如果休眠時間過長,則執行緒還存活,可能被stop()殺掉
      }
      
}

 2-3.接下來測試以上兩個類 

public class ThreadTest {
	/**
	 *學習多執行緒例子
	 * @param args
	 * @author JJ
	 */
	public static void main(String[] args) {
		 System.out.println("我是主執行緒!");
         //下面建立執行緒例項thread1
         ThreadUseExtends thread1=new ThreadUseExtends();
         //建立thread2時以實現了Runnable介面的THhreadUseRunnable類例項為引數
         Thread thread2=new Thread(new ThreadUseRunnable(),"SecondThread");
         thread1.start();//啟動執行緒thread1使之處於就緒狀態
         //thread1.setPriority(6);//設定thread1的優先順序為6
         //優先順序將決定cpu空出時,處於就緒狀態的執行緒誰先佔領cpu開始執行
         //優先順序範圍1到10,MIN_PRIORITY,MAX_PRIORITY,NORM_PAIORITY
         //新執行緒繼承建立她的父執行緒優先順序,父執行緒通常有普通優先順序即5NORM_PRIORITY
         System.out.println("主執行緒將掛起7秒!");
         try
         {
                 Thread.sleep(3000);//主執行緒掛起7秒
         }
         catch (InterruptedException e)
         {
                 return;
         }
         System.out.println("又回到了主執行緒1!");
         if(thread1.isAlive())
         {    
                 thread1.stop();//如果thread1還存在則殺掉他
                 System.out.println("thread1休眠過長,主執行緒殺掉了thread1!");
         }
         else
                 System.out.println("主執行緒沒發現thread1,thread1已醒順序執行結束了!");
         thread2.start();//啟動thread2
         System.out.println("主執行緒又將掛起7秒!");
         try
         {
                 Thread.sleep(7000);//主執行緒掛起7秒
         }
         catch (InterruptedException e)
         {
                 return;
         }
         System.out.println("又回到了主執行緒2!");
         if(thread2.isAlive())
         {    
                 thread2.stop();//如果thread2還存在則殺掉他
                 System.out.println("thread2休眠過長,主執行緒殺掉了thread2!");
         }
         else
                 System.out.println("主執行緒沒發現thread2,thread2已醒順序執行結束了!");
         System.out.println("程式結束按任意鍵繼續!");
         try
         {
                 System.in.read();
         }
         catch (IOException e)
         {
                 System.out.println(e.toString());
         }
         
 }//main
	}

  2-4.執行檢視效果

2.執行緒池

(1)理解,執行緒池就是用來管理執行緒的,執行緒要建立摧毀很耗時和記憶體資源,就像一次性筷子生產到扔掉,我們執行緒池就像家用筷子,可以用很多次,執行緒池就是這麼一個作用

(2)例子,我覺得馮小衛寫了很好我參考了一下他的 http://blog.csdn.net/coding_or_coded/article/details/6856014,執行緒池有好幾種,各有利弊

  2-1.固定大小的執行緒池,newFixedThreadPool:

  1. package app.executors;  
  2.   
  3. import java.util.concurrent.Executors;  
  4. import java.util.concurrent.ExecutorService;  
  5.   
  6. /** 
  7.  * Java執行緒:執行緒池 
  8.  *  
  9.  * @author 馮小衛 
  10.  */  
  11. public class Test {  
  12.     public static void main(String[] args) {  
  13.         // 建立一個可重用固定執行緒數的執行緒池  
  14.         ExecutorService pool = Executors.newFixedThreadPool(5);  
  15.         // 建立執行緒  
  16.         Thread t1 = new MyThread();  
  17.         Thread t2 = new MyThread();  
  18.         Thread t3 = new MyThread();  
  19.         Thread t4 = new MyThread();  
  20.         Thread t5 = new MyThread();  
  21.         // 將執行緒放入池中進行執行  
  22.         pool.execute(t1);  
  23.         pool.execute(t2);  
  24.         pool.execute(t3);  
  25.         pool.execute(t4);  
  26.         pool.execute(t5);  
  27.         // 關閉執行緒池  
  28.         pool.shutdown();  
  29.     }  
  30. }  
  31.   
  32. class MyThread extends Thread {  
  33.     @Override  
  34.     public void run() {  
  35.         System.out.println(Thread.currentThread().getName() + "正在執行。。。");  
  36.     }  
  37. }  

  執行結果和其他解釋具體可以參照一下上面連結

 

相關文章