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

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

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

    posts - 70,comments - 408,trackbacks - 0

    多線程是JAVA語言的一大特性,多線程就是同時存在N個執行體,按幾條不同的執行線索共同工作的情況.程序,進程,線程,可以從不同的角度去理解.程序就是一段靜態的代碼,可以理解成一組計算機命令的集合.進行就是這個程序一次動態的執行過程,從代碼的加載到執行完畢的一個過程.線程是一個比進程小的單位,一個進程再執行的過程中可以產生多個線程,每個線程也是由生產到銷毀,可以理解成是進行的子集.我個人用一個覺得還算恰當的比喻來比喻三者.QQ客戶端就是一個程序,登陸一個QQ就是開始了這個程序的一個進程,再QQ上發送消息給好友就貌似這個進程中的一個線程.不知道這樣比喻恰當否?

    線程也是有狀態和聲明周期的,每個JAVA程序都會有一個缺省的主線程,對于應用程序applcation來說main方法就是一個主線程.JAVA語言使用的是Thread類及其子類的對象來表示線程的.創建一個新的線程的生命周期如下狀態:

    1)              新建:當一個Thread類或者其子類的對象被聲明并創建時,新的線程對象處于新建狀態,此時它已經有了相應的內存空間和其他資源.

    2)              就緒:處于新建狀態的線程被啟動后,將進入線程隊列排隊等待CUP服務,這個時候具備了運行的條件,一旦輪到CPU的時候,就可以脫離創建它的主線程獨立開始自己的生命周期.

    3)              運行:就緒的線程被調度并獲得CUP的處理邊進入了運行狀態,每一個Thread類及其子類的對象都有一個重要的run()方法,當線程對象被調度執行的時候,它將自動調用本對象的run()方法,從第一句代碼開始執行.所以說對線程的操作應該寫到run()方法中.

    4)              阻塞:一個正在執行的線程如果再某種情況下不能執行了.進入阻塞狀態,這個時候它不能進入排隊狀態,只有引起了阻塞的原因消失的時候,線程才可以繼續進入排隊狀態等待CUP處理.

    5)              死亡:處于死亡狀態的線程不具有繼續執行的能力,線程死亡主要的原因是正常運行的線程完成了全部工作,即執行完了run()方法,另外就是被提前強制的終止了.

    線程的調度也是有優先級別的,就是說同樣的排列優先級高可以提前被CPU處理,主要分三個級別,高中低.分別代表的數字是10.5.1分別有三個常量代表不可以被改變.最小優先級的常量是MIN_PRIORITY,普通的優先級的常量是NORM_PRIORITY,最高的優先級的常量是MAX_PRIORITY一般主線程的優先級是普通,另外可以通過Thread類的setPriority(int a)方法來修改系統自動設置的線程優先級.

    JAVA中編程實現多線程應有兩種途徑,一種是創建自己的線程子類,另外是實現一個接口Runnable.無論是那種途徑最終讀需要使用Thread類及其方法.Thread類有兩種構造方法.public Thread()用來創建一個線程對象.public Thread(Runnable r)創建線程對象,參數r成為被創建的目標對象.這個目標必須實現Runnbale接口,給出該接口的run()方法的方法體,再方法體中操作.用兩個構造方法創建完的線程就是一個新建的狀態,等待處理.然后啟動線程的start()方法,啟動線程對象,線程進入排隊狀態也就是就緒狀態.然后線程操作run()方法這個方法里的內容是被系統處理的內容.如果想使線程進入休眠狀態可以調用sleep()方法,可以給一個參數,代表休眠的毫秒.如果給兩個參數代表那秒.終止線程用yield()方法來完成.判斷線程是否銷毀可以用idAlive()方法判斷線程是否活著.Runnable接口只有一個方法run()方法,我們實現這個接口把要操作的代碼寫到這個方法中,然后再把實現了整個接口的類的實例傳給Therad類的構造方法即可操作線程.

    線程同步是一個再處理線程的時候需要注意的問題,同步方法要用synchronized關鍵字類修飾,被這個關鍵字修飾后,當一個線程A使用這個方法后,其它線程想使用這個方法就必須等待,知道線程A使用完該方法后方可使用.下面我寫一個例子來說明線程同步,這個例子有兩個線程會計和出納,他們共同有一個賬本.他們倆都可以存取方法對賬本進行訪問,會計使用存取方法的時候寫入存錢的記錄,出納則寫入取錢的記錄.因此會計使用賬本的時候出納被禁止使用,反之也是如此.就是一個人使用另外一個人必須等待.下面我通過一個小程序Applet來實現這個事:

    import java.applet.*;

    import java.awt.*;

    import java.awt.event.*;

     

    public class MyThread extends Applet implements Runnable {

       

        int money = 100;

        TextArea text1 = null;

        TextArea text2 = null;

        Thread Kuaiji = null;

        Thread Chuna = null;

       

        public void init() {

            Kuaiji = new Thread(this);

            Chuna = new Thread(this);

            text1 = new TextArea(20,8);

            text2 = new TextArea(20,8);

            add(text1);

            add(text2);

        }

       

        public void start() {

            Kuaiji.start();

            Chuna.start();

        }

       

        public synchronized void Cunqu(int number) {

            if(Thread.currentThread() == Kuaiji) {

                for(int i=1;i<=3;i++) {

                    money = money + number;

                    try {Thread.sleep(1000);}

                    catch(Exception e){}

                    text1.append("\n"+money);

                }

            }

            else if(Thread.currentThread() == Chuna) {

                for(int i=1;i<=2;i++) {

                    money = money - number/2;

                    try {Thread.sleep(1000);}

                    catch(Exception e){}

                    text2.append("\n"+money);

                }

            }

        }

       

        public void run() {

            if(Thread.currentThread()==Kuaiji || Thread.currentThread()==Chuna) {

                for(int i=1;i<=3;i++) {

                    Cunqu(30);

                }

            }

        }

    }

    當一個線程使用同步方法中的某個變量,而此變量又需要其他線程修改后才能符合本線程的需要,那么可以再同步方法中使用wait()方法,使本線程等待,并允許其他線程使用這個同步方法.用notfyAll()方法同志所有的由于使用這個同步方法的處于等待的線程結束等待進入同步方法中運行,如果使使用notfy()就是單獨同志一個線程進行同步方法進行活動.簡單的理解就是wait()方法讓線程等待,notfy()當一個線程運行,notfyAll()讓全部線程運行.雖然JAVA支持多線程.一般線程不需要我們自己處理.但是也是需要了解和掌握的.再日后的項目中獲取會根據不同情況,有不同的需求.呵呵!!
    posted on 2005-11-03 15:28 我心依舊 閱讀(5394) 評論(4)  編輯  收藏

    FeedBack:
    # re: JAVA多線程機制
    2006-04-10 11:01 | 劉長龍
    這些方面的介紹是很基礎的東西了,不過還是要感謝你,但是有沒有在實際項目的應用中的使用例子。我最近完成了一個指標對標管理系統的項目,里面用到了多線程,主要的目的是為了進行大量數據的計算,這些計算是在用戶錄入數據后,點擊“保存”按鈕時做的,因為要給用戶一個反饋信息,所以在數據保存到數據庫后就提示“保存成功”,之后就調用了計算數據的線程,用來計算數據結果。
    我現在遇到的問題是,如果用戶數量超過30個,或者說30個用戶在保存數據后啟動線程那么系統就登錄不了,現在沒有辦法確定是不是由于線程造成的原因,所以請教一下,看您是否遇到過類似的情況。  回復  更多評論
      
    # re: JAVA多線程機制
    2007-07-05 09:42 | MING.YI
    學習了.  回復  更多評論
      
    # re: JAVA多線程機制
    2007-07-30 13:51 | breathe
    覺得進程其實也是靜態的,基本上都是他里面的線程在起作用。。。。。

    不過謝謝LZ,學習了,我現在正在學習如何學會總結自己的心得,到時候也請LZ幫忙指點指點!~

      回復  更多評論
      
    # re: JAVA多線程機制[未登錄]
    2008-01-17 21:07 | mashiguang
    錯別字忒多,不想看了.  回復  更多評論
      

    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 伊人久久亚洲综合影院| 免费可以看黄的视频s色| 日韩亚洲国产综合高清| 亚洲一区二区三区偷拍女厕 | 国产亚洲精品成人a v小说| 四虎亚洲精品高清在线观看| 成人AV免费网址在线观看| 少妇性饥渴无码A区免费| 久久精品国产亚洲av品善 | 三年片在线观看免费观看大全动漫 | 亚洲精品美女网站| 久久亚洲AV成人无码电影| 亚洲午夜日韩高清一区| 国产免费AV片无码永久免费| 成人在线免费看片| 蜜桃AV无码免费看永久| 日韩免费在线视频| 久久久久国色AV免费观看| 一级日本高清视频免费观看| 边摸边吃奶边做爽免费视频99| 亚洲视频在线观看2018| 亚洲人成网站在线观看播放青青| 亚洲综合一区二区精品导航| 亚洲精品卡2卡3卡4卡5卡区| 亚洲综合色区在线观看| 国产精品亚洲mnbav网站 | 亚洲AV无码国产一区二区三区 | 国产卡一卡二卡三免费入口| 久久精品无码专区免费东京热| 成人久久免费网站| 久久久久久免费一区二区三区| 国产精品免费久久| 中文字幕不卡免费高清视频| 黄色网址免费在线观看| 巨胸喷奶水www永久免费| 中文字幕乱码免费看电影| 久久精品视频亚洲| 亚洲av无码成人黄网站在线观看 | 美女无遮挡拍拍拍免费视频| 本道天堂成在人线av无码免费| 成人网站免费大全日韩国产|