<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-42  評論-42  文章-0  trackbacks-0
    用于線程實現的類和接口分別是什么?簡單舉出使用范例。

    JAVA線程的實現--Thread類與Runnable接口

      要記住的一件重要的事情是main() 函數也是一個線程,并可用來做有用的工作。程序員只有在需要多個線程時才需要創建新的線程。
      Thread 類
      Thread 類是一個具體的類,而非抽象類.該類封裝了線程的行為。要創建一個線程,必須創建一個從 Thread 類繼承的新類。程序員必須覆蓋 Thread 的 run() 函數來完成有用的工作。用戶并不直接調用此函數;而是必須調用 Thread 的 start() 函數,該函數再調用 run()。下面的代碼說明了它的用法:
      創建兩個新線程:

    import java.util.*;

    class TimePrinter extends Thread {
     
    int pauseTime;
     String name;
     
    public TimePrinter(int x, String n) {
      pauseTime 
    = x;
      name 
    = n;
     }


     
    public void run() {
      
    while(true{
       
    try {
        System.out.println(name 
    + ":" + new    
               Date());
        Thread.sleep(pauseTime);
       }
     catch(Exception e) {
        System.out.println(e);
       }

      }

     }


     
    static public void main(String args[]) {
      TimePrinter tp1 
    = new TimePrinter(1000"Fast Guy");
      tp1.start();
      TimePrinter tp2 
    = new TimePrinter(3000"Slow Guy");
      tp2.start();

     }

    }
     在本例中,我們可以看到一個簡單的程序,它按兩個不同的時間間隔(1 秒和 3 秒)在屏幕上顯示當前時間。這是通過創建兩個新線程來完成的,包括 main() 共三個線程。但是,因為有時要作為線程運行的類可能已經是某個類層次的一部分,所以就不能再按這種機制創建線程。雖然在同一個類中可以實現任意數量的接口,但 Java 編程語言只允許一個類有一個父類。同時,某些程序員避免從 Thread 類導出,因為它強加了類層次。對于這種情況,就要 runnable 接口。

      Runnable 接口
      此接口只有一個函數,run(),此函數必須由實現了此接口的類實現。但是,就運行這個類而論,其語義與前一個示例稍有不同。我們可以用 runnable 接口改寫前一個示例。
      創建兩個新線程而不強加類層次:
    import java.util.*;

    class TimePrinter implements Runnable {
     
    int pauseTime;
     String name;
     
    public TimePrinter(int x, String n) {
      pauseTime 
    = x;
      name 
    = n;
     }


     
    public void run() {
      
    while(true{
       
    try {
        System.out.println(name 
    + ":" + new Date());
        Thread.sleep(pauseTime);
       }
     catch(Exception e) {
        System.out.println(e);
       }

      }

     }


     
    static public void main(String args[]) {
      Thread t1 
    = new Thread(new TimePrinter(1000"Fast Guy"));
      t1.start();
      Thread t2 
    = new Thread(new TimePrinter(3000"Slow Guy"));
      t2.start();
     }

    }
     請注意,當使用 runnable 接口時,不能直接創建所需類的對象并運行它;必須從 Thread 類的一個實例內部運行它。許多程序員更喜歡 runnable 接口,因為從 Thread 類繼承會強加類層次。

    練習:
    package thread;

    import java.util.Date;

    public class ThreadTest2 extends Thread {
        
    private String name;
        
    private int time;

        
    public ThreadTest2(String name, int time) {
            
    super();
            
    this.name = name;
            
    this.time = time;
        }


        @Override
        
    public void run() {
            
    try {
                Thread.sleep(time);
                System.out.println(name 
    + ":" + new Date());
            }
     catch (Exception e) {
                
    // TODO: handle exception
            }

        }


        
    public static void main(String[] args) {
            System.out.println(
    "chh");
            ThreadTest2 tt2 
    = new ThreadTest2("yiqi"5000);
            tt2.start();
        }

    }



    package thread;

    import java.util.Date;

    public class RunnableImpl2 implements Runnable {

        
    private long time;

        
    public RunnableImpl2(long time) {
            
    super();
            
    this.time = time;
        }


        @Override
        
    public void run() {
            
    try {
                Thread.sleep(time);
                System.out.println(
    "jn" + ":" + new Date());
            }
     catch (Exception e) {
                
    // TODO: handle exception
            }

        }


        
    public static void main(String[] args) {
            Thread td 
    = new Thread(new RunnableImpl2(5000));
            td.start();
            System.out.println(
    "haha" + ":" + new Date());

        }

    }



      synchronized(同步的) 關鍵字
     
      到目前為止,我們看到的示例都只是以非常簡單的方式來利用線程。只有最小的數據流,而且不會出現兩個線程訪問同一個對象的情況。但是,在大多數有用的程序中,線程之間通常有信息流。試考慮一個金融應用程序,它有一個 Account 對象,如下例中所示:
      一個銀行中的多項活動:

     
    public class Account {
     String holderName;
     
    float amount;
     
    public Account(String name, float amt) {
     holderName 
    = name;
     amount 
    = amt;
    }


    public void deposit(float amt) {
     amount 
    += amt;
    }


    public void withdraw(float amt) {
     amount 
    -= amt;
    }


    public float checkBalance() {
     
    return amount;
    }

    }

     在此代碼樣例中潛伏著一個錯誤。如果此類用于單線程應用程序,不會有任何問題。但是,在多線程應用程序的情況中,不同的線程就有可能同時訪問同一個 Account 對象,比如說一個聯合帳戶的所有者在不同的 ATM 上同時進行訪問。在這種情況下,存入和支出就可能以這樣的方式發生:一個事務被另一個事務覆蓋。這種情況將是災難性的。但是,Java 編程語言提供了一種簡單的機制來防止發生這種覆蓋。每個對象在運行時都有一個關聯的鎖。這個鎖可通過為方法添加關鍵字 synchronized 來獲得。這樣,修訂過的 Account 對象(如下所示)將不會遭受像數據損壞這樣的錯誤:
    public class Account {
     String holderName;
     
    float amount;
     
    public Account(String name, float amt) {
     holderName 
    = name;
     amount 
    = amt;
    }


    public synchronized void deposit(float amt) {
     amount 
    += amt;
    }


    public synchronized void withdraw(float amt) {
     amount 
    -= amt;
    }


    public float checkBalance() {
     
    return amount;
    }

    }

      對一個銀行中的多項活動進行同步處理:

      deposit() 和 withdraw() 函數都需要這個鎖來進行操作,所以當一個函數運行時,另一個函數就被阻塞。請注意, checkBalance() 未作更改,它嚴格是一個讀函數。因為 checkBalance() 未作同步處理,所以任何其他方法都不會阻塞它,它也不會阻塞任何其他方法,不管那些方法是否進行了同步處理.



    關于synchronized

    1、synchronized關鍵字的作用域有二種:

    1)是某個對象實例內,synchronized aMethod(){}可以防止多個線程同時訪問這個對象的synchronized方法(如果一個對象有多個synchronized方法,只要一個線程訪問了其中的一個synchronized方法,其它線程不能同時訪問這個對象中任何一個synchronized方法)。這時,不同的對象實例的synchronized方法是不相干擾的。也就是說,其它線程照樣可以同時訪問相同類的另一個對象實例中的synchronized方法;

    2)是某個類的范圍,synchronized static aStaticMethod{}防止多個線程同時訪問這個類中的synchronized static 方法。它可以對類的所有對象實例起作用。

    2、除了方法前用synchronized關鍵字,synchronized關鍵字還可以用于方法中的某個區塊中,表示只對這個區塊的資源實行互斥訪問。用法是: synchronized(this){/*區塊*/},它的作用域是當前對象;

    3、synchronized關鍵字是不能繼承的,也就是說,基類的方法synchronized f(){} 在繼承類中并不自動是synchronized f(){},而是變成了f(){}。繼承類需要你顯式的指定它的某個方法為synchronized方法;



    posted on 2008-06-17 20:55 BlueSunshine 閱讀(286) 評論(7)  編輯  收藏 所屬分類: 參考資料

    評論:
    # re: 面試題 2008-06-18 12:23 | BlueSunshine
    collection 與 collections 的區別

     Collection是集合的接口(不包括 map), set 和 list 這兩個接口繼承了 collection 接口;
    Collections是針對集合類的一個幫助類,他提供一系列靜態方法實現對各種集合的搜索、排序、線程安全化等操作。
      回復  更多評論
      
    # re: 面試題 2008-06-18 12:26 | BlueSunshine
    final, finally, finalize的區別

    final 用于聲明屬性,方法和類,分別表示屬性不可變,方法不可覆蓋,類不可繼承。
    finally是異常處理語句結構(可選的)的一部分,表示總是執行。try{}catch(){}finally{}
    finalize是Object類的一個方法,在垃圾收集器執行的時候會調用被回收對象的此方法,可以覆蓋此方法提供垃圾收集時的其他資源回收,例如關閉文件等。
      回復  更多評論
      
    # re: 面試題 2008-06-18 12:41 | BlueSunshine
    HashMap和Hashtable的區別
     
      Hashtable繼承自Dictionary類(Dictionary類也實現了Map 接口),而HashMap是Java1.2引進的Map interface的一個實現類。他們都實現了Map接口。Hashtable和HashMap采用的hash/rehash算法都大概一樣,所以性能不會有很大的差異。

      區別1:HashMap允許將null作為一個entry(名值對)的key或者value,由于非線程安全,效率上可能高于Hashtable,而Hashtable不允許。HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。因為contains方法容易讓人引起誤解。

      區別2:Hashtable的方法是Synchronize的,而HashMap不是,在多個線程訪問Hashtable時,不需要自己為它的方法實現同步,而HashMap 就必須為之提供外同步。
      回復  更多評論
      
    # re: 面試題 2008-06-18 12:51 | BlueSunshine
    session 與cookie 的區別
     
      Session是由應用服務器維持的一個服務器端的存儲空間,Cookie是客戶端的存儲空間,由瀏覽器來維持。用戶在連接服務器時,會由服務器生成一個唯一的SessionID,用該SessionID 為標識符來存取服務器端的Session存儲空間。而SessionID這一數據則是保存到客戶端,用Cookie保存的,用戶提交頁面時,會將這一 SessionID提交到服務器端,來存取Session數據。
     
      
      服務器也可以通過URL重寫的方式來傳遞SessionID的值,因此不是完全依賴Cookie。如果客戶端Cookie禁用,則服務器可以自動通過重寫URL的方式來保存Session的值,并且這個過程對程序員透明。可以試一下,即使不寫Cookie,在使用request.getCookies();取出的Cookie數組的長度也是1,而這個Cookie的名字就是JSESSIONID,還有一個很長的二進制的字符串,是SessionID的值。

      回復  更多評論
      
    # re: 面試題 2008-06-18 13:06 | BlueSunshine
    JVM
     
    Java Virtual Machine(Java虛擬機),它是一個虛構出來的計算機,是通過在實際的計算機上仿真模擬各種計算機功能來實現的。Java虛擬機有自己完善的硬件架構,如處理器、堆棧、寄存器等,還具有相應的指令系統。JVM屏蔽了與具體操作系統平臺相關的信息,使得Java程序只需生成在Java虛擬機上運行的目標代碼(字節碼),就可以在多種平臺上不加修改地運行。Java虛擬機在執行字節碼時,實際上最終還是把字節碼解釋成具體平臺上的機器指令執行。
      回復  更多評論
      
    # re: 面試題 2008-06-18 13:16 | BlueSunshine
    Servlet
     
      Servlet是使用Java Servlet 應用程序設計接口(API)及相關類和方法的 Java 程序。除了 Java Servlet API,Servlet 還可以使用用以擴展和添加到 API 的 Java 類軟件包。Servlet 在啟用 Java 的 Web 服務器上或應用服務器上運行并擴展了該服務器的能力。Java servlet對于Web服務器就好象Java applet對于Web瀏覽器。Servlet裝入Web服務器并在Web服務器內執行,而applet裝入Web瀏覽器并在Web瀏覽器內執行。Java Servlet API 定義了一個servlet 和Java使能的服務器之間的一個標準接口,這使得Servlets具有跨服務器平臺的特性。
      Servlet 通過創建一個框架來擴展服務器的能力,以提供在 Web 上進行請求和響應服務。當客戶機發送請求至服務器時,服務器可以將請求信息發送給 Servlet,并讓 Servlet 建立起服務器返回給客戶機的響應。 當啟動 Web 服務器或客戶機第一次請求服務時,可以自動裝入 Servlet。裝入后, Servlet 繼續運行直到其它客戶機發出請求。Servlet 的功能涉及范圍很廣。例如,Servlet 可完成如下功能:

     

    (1) 創建并返回一個包含基于客戶請求性質的動態內容的完整的 HTML頁面。

    (2) 創建可嵌入到現有 HTML 頁面中的一部分 HTML 頁面(HTML 片段)。

    (3) 與其它服務器資源(包括數據庫和基于 Java 的應用程序)進行通信。

    (4) 用多個客戶機處理連接,接收多個客戶機的輸入,并將結果廣播到多個客戶機上。例如,Servlet 可
    以是多參與者的游戲服務器。

    (5) 當允許在單連接方式下傳送數據的情況下,在瀏覽器上打開服務器至applet的新連接,并將該連
    接保持在打開狀態。當允許客戶機和服務器簡單、高效地執行會話的情況下,applet也可以啟動客戶瀏覽器和服務器之間的連接。可以通過定制協議或標準(如 IIOP)進行通信。

    (6) 對特殊的處理采用 MIME 類型過濾數據,例如圖像轉換和服務器端包括(SSI)。

    (7) 將定制的處理提供給所有服務器的標準例行程序。例如,Servlet 可以修改如何認證用戶。

    Servlet 的生命周期

      Servlet 的生命周期始于將它裝入 Web 服務器的內存時,并在終止或重新裝入 Servlet 時結束。

    (1) 初始化
    在下列時刻裝入 Servlet:
    =如果已配置自動裝入選項,則在啟動服務器時自動裝入
    =在服務器啟動后,客戶機首次向 Servlet 發出請求時
    =重新裝入 Servlet 時
    裝入 Servlet 后,服務器創建一個 Servlet 實例并且調用 Servlet 的 init() 方法。在初始化階段,Servlet 初始化參數被傳遞給 Servlet 配置對象。

    (2) 請求處理
    對于到達服務器的客戶機請求,服務器創建特定于請求的一個"請求"對象和一個"響應"對象。服務器調用 Servlet 的 service() 方法,該方法用于傳遞"請求"和"響應"對象。service() 方法從"請求"對象獲得請求信息、處理該請求并用"響應"對象的方法以將響應傳回客戶機。service() 方法可以調用其它方法來處理請求,例如 doGet()、doPost() 或其它的方法。

    (3) 終止
    當服務器不再需要 Servlet, 或重新裝入 Servlet 的新實例時,服務器會調用 Servlet 的 destroy() 方法。

      回復  更多評論
      
    # re: 面試題 2008-06-18 22:27 | BlueSunshine
    1 替換
    2 編碼轉換
    3 一個RuntimeException例子  回復  更多評論
      
    主站蜘蛛池模板: 91亚洲性爱在线视频| 久久久久久国产精品免费无码| 久久精品国产亚洲精品2020| 亚洲AV网站在线观看| 成人女人A级毛片免费软件| 免费观看一区二区三区| 美女被爆羞羞网站免费| 亚洲中文字幕无码av永久| 亚洲伊人久久精品| 亚洲另类激情综合偷自拍| 亚洲国产三级在线观看| 亚洲精品视频免费观看| 国产精品国产免费无码专区不卡| 国产福利视精品永久免费| 老司机69精品成免费视频| 黄色视屏在线免费播放| 欧亚一级毛片免费看| 久久精品国产亚洲AV电影网| 国产成人亚洲合集青青草原精品 | 中文字幕亚洲精品无码| 亚洲最大福利视频网站| 亚洲国产精品久久久久婷婷老年| 久久久久亚洲AV成人网人人网站| jjzz亚洲亚洲女人| 国产男女猛烈无遮挡免费视频 | 亚洲精品成人网站在线播放 | 免费一区二区三区| 四虎影视无码永久免费| 中国黄色免费网站| 成人免费区一区二区三区| 99精品视频在线观看免费| a国产成人免费视频| 水蜜桃视频在线观看免费播放高清 | 亚洲国产成人久久精品大牛影视 | 毛片基地免费观看| 四虎www成人影院免费观看| 麻豆国产人免费人成免费视频| 日韩激情淫片免费看| 免费v片在线观看| 亚洲情侣偷拍精品| 亚洲无av在线中文字幕|