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

Java多線程基礎總結二: Thread

編輯:關於JAVA

對於Thread來說只想說兩個方法,一個是setDaemon(false|true),另一個是join()。首先說說守護線程,這麼東西是干什麼用的?對於 Java應用我們都知道main方法是入口,它的運行代表著主線程開始工作了,我們也知道JVM裡面有垃圾回收器的存在使得我們放心讓main飛 奔,然而這背後的故事是垃圾回收線程作為守護著主線程的守護線程默默的付出著。很像那個啥啊,呵呵。令人發指的是main這個畜生背後 其實有好幾個守護線程默默的付出!當然如果硬是要把守護線程比做女人,非守護線程比做男人的話,那麼一個男人背後可以有多個默默付 出的女人。Java在設計時就默認了這個現實社會不太能實現的現實,並且強制規定如果男人不在了,這個虛擬世界就over了,看來資本主義 社會下長大的孩子創造的東西骨子裡是封建社會的血脈啊!扯遠了,對的,JVM內部的實現是如果運行的程序只剩下守護線程的話,程序將 終止運行,直接結束。所以守護線程是作為輔助線程存在的,主要的作用是提供計數等等輔助的功能。下面寫個小例子說明一下:

Java代碼

/**
  * User: yanxuxin
  * Date: Dec 10, 2009
  * Time: 7:16:55 PM
  */
public class DaemonSample {
   public static void main(String[] args) throws Exception{
     DaemonThread t = new DaemonThread();
     t.setDaemon(true);//this is set t thread as a daemon thread.
     t.start();
     Thread.sleep(2000);
     System.out.println("main thread exit.");
   }
}

class DaemonThread extends Thread {
   @Override 
   public void run() {
     for(int i = 0; i < 10; i++) {
       try {
         Thread.sleep(1000);
       } catch (InterruptedException e) {
         e.printStackTrace();
       }
       System.out.println("i=" + i);
     }
   }
}

這個例子的結果是main主線程睡兩秒之後說再見,而子線程則是在這兩秒內計計數然後跟著一起說再見。當然它很不情願,因為它想計 10秒,但是沒機會。把t.setDaemonThread(true)注釋掉你會看到主線程說再見了,但是子線程快快樂樂的計完數說再見。這就是守護線程 的作用,一切以非守護線程為主!很癡情啊,哈哈。

另一個就是join方法,在簡單的多線程編程中,常常使用它來控制線程的執行順序,也僅僅是一小部分的作用。它的內部實現是wait(0) 直至被調用線程執行完畢,調用線程才被喚醒。還是寫個小例子解釋一下:

Java代碼

/**
  * User: yanxuxin
  * Date: Dec 11, 2009
  * Time: 6:27:04 PM
  */
public class JoinSample {
   public static void main(String[] args) throws Exception{
     Thread t = new Thread(new SubThread());
     t.start();
     t.join();
     System.out.println("The end of main thread...");
   }
}

class SubThread implements Runnable {

   public void run() {
     try {
       Thread.sleep(2000);
     } catch (InterruptedException e) {
       e.printStackTrace();
     }
     System.out.println("The end of sub thread...");
   }
}

在這個例子中,被調用join()的線程是t,而調用線程則是main所以會先打印下面的那句再打印上面的,即使t要先睡兩秒,main也得等 著。把t.join()注釋掉,main就可以揚眉吐氣了。

很多情況下我們用不到多線程,但是不幸或者幸運的是硬件的發展,在核心頻率因為晶體管密度的物理原因而很難再有突破時,CPU制造 商都開始從核心的數量上做文章了。從雙核到4核,6核,8核,16核,48核...這麼多核心帶來了編程的轉變,越來越多的程序需要考慮多核 多線程的優勢,加上技術發展的原始推動力--商業需求,共同推進了多線程編程時代。因為並發優勢而被炒作為Java終結者的Scala慢慢的 抬起頭來,我也簡單的學習了其部分內容,在多線程的編程上的確也沒Java這麼多的陷阱,封裝的更簡潔。Java始終給人的感覺是寫了很多 ,做的很少,這種感覺程序員或許能接受,畢竟代碼量上去了,但是估計燒錢的老板會瘋掉。不過看到JDK7將會大量的改進 java.util.concurrent包的實用性和並發性能的提高,或許掌握Java多線程的門檻會低一點。但願不用混搭語言解決問題,雖然都是跑在 JVM上的靜態語言。關於java.util.concurrent包的整理,還沒想好搞透徹,暫時無話可說。

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