大战熟女丰满人妻av-荡女精品导航-岛国aaaa级午夜福利片-岛国av动作片在线观看-岛国av无码免费无禁网站-岛国大片激情做爰视频

專注Java教育14年 全國咨詢/投訴熱線:400-8080-105
動力節(jié)點LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁 hot資訊 Java多線程實例解析

Java多線程實例解析

更新時間:2021-04-29 10:02:21 來源:動力節(jié)點 瀏覽1095次

1.Java中的多線程有三種實現(xiàn)方式:

(1)繼承Thread類,重寫run方法。Thread本質(zhì)上也是一個實現(xiàn)了Runnable的實例,他代表一個線程的實例,并且啟動線程的唯一方法就是通過Thread類的start方法。

(2)實現(xiàn)Runnable接口,并實現(xiàn)該接口的run()方法.創(chuàng)建一個Thread對象,用實現(xiàn)的Runnable接口的對象作為參數(shù)實例化Thread對象,調(diào)用此對象的start方法。

(3)實現(xiàn)Callable接口,重寫call方法。Callable接口與Runnable接口的功能類似,但提供了比Runnable更強大的功能。有以下三點

1)Callable可以在人物結(jié)束后提供一個返回值,Runnable沒有提供這個功能。

2)Callable中的call方法可以拋出異常,而Runnable的run方法不能拋出異常。

3)運行Callable可以拿到一個Future對象,表示異步計算的結(jié)果,提供了檢查計算是否完成的方法。

需要注意的是,無論用那種方式實現(xiàn)了多線程,調(diào)用start方法并不意味著立即執(zhí)行多線程代碼,而是使得線程變?yōu)榭蛇\行狀態(tài)。

2.run start的區(qū)別

start方法是啟動一個線程,而線程中的run方法來完成實際的操作。

如果開發(fā)人員直接調(diào)用run方法,那么就會將這個方法當(dāng)作一個普通函數(shù)來調(diào)用,并沒有多開辟線程,開發(fā)人員如果希望多線程異步執(zhí)行,則需要調(diào)用start方法。

3.sleep wait的區(qū)別

(1)兩者處理的機制不同,sleep方法主要是,讓線程暫停執(zhí)行一段時間,時間一到自動恢復(fù),并不會釋放所占用的鎖,當(dāng)調(diào)用wait方法以后,他會釋放所占用的對象鎖,等待其他線程調(diào)用notify方法才會再次醒來。

(2)sleep是Threa的靜態(tài)方法,是用來控制線程自身流程的,而wait是object的方法,用于進行線程通信。

(3)兩者使用的區(qū)域不同。sleep可以在任何地方使用,wait必須放在同步控制方法,或者語句塊中執(zhí)行。

4.synchronized notify wait的運用

synchronized關(guān)鍵字有兩種用法,synchronized方法和synchronized語句塊。

public synchronized void function(){}

synchronized(object){}

當(dāng)某個資源被synchronized所修飾,線程1線程2等多個線程在共同請求這個資源,線程1先請求到,調(diào)用了對象的wait方法釋放了對象的鎖,此時線程2可以對這個對象進行訪問,在工作結(jié)束時可以調(diào)用對象的notify方法,喚醒等待隊列中正在等待的線程,此時被喚醒的線程將會再一次拿到對象鎖,對對象進行操作。可以調(diào)用notifyAll方法,喚醒等待隊列中的所有線程。

需要注意的是一個線程被喚醒不代表立即獲取對象鎖,必須等調(diào)用的線程對象的方法推出synchronized塊釋放對象鎖后,被喚醒的進程才會獲得對象鎖。

5.以下為大家提供一個簡單的代碼實例:

分別用Runnable和Thread方法實現(xiàn),展示各個方法的

實現(xiàn)Runnable實現(xiàn)多線程的方法

public class TestRunnable implements Runnable {
    private int time=1;
    private SourceA s;
    private String id = "001";
    public TestRunnable(SourceA s){
        this.s = s;
    }
    public void setTime(int time) {
        this.time = time;
    }    
    @Override
    public void run() {
        try {
            System.out.println("i will sleep"+ time);
            Thread.sleep(time);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        synchronized(s){
            s.notify();
            System.out.println("我喚醒了002!");
            System.out.println("我存入了id"+id);
            s.setSource(id);
        }
    }
}

繼承Thread實現(xiàn)多線程的方法

public class TestThread extends Thread {
    private int time = 1;
    private SourceA s = null;
    String id = "002";    
    public void setTime(int time) {
        this.time = time;
    }    
    public TestThread(SourceA s){
        this.s = s ;
    }    
    @Override
    public void run() {
        try {
            System.out.println("i will sleep"+ time);
            sleep(time);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }       
        synchronized(s){
            try {
                System.out.println("我"+ id +"要進行等待了");
                s.wait();
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            System.out.println("我被喚醒了");
            System.out.println("我存入了id"+id);
            s.setSource(id);
        }
    }
}

SourceA類代碼:

public class SourceA {
    private List<String> list = new ArrayList<String>();
    public synchronized void getSource(){
        for(int i=0;i<list.size();i++){
            System.out.println(list.get(i));
        }
    }
    public synchronized void setSource(String id){
        list.add(id);
    }
}

Test測試類代碼:

public void test(){
        SourceA s = new SourceA();
        TestThread tt = new TestThread(s);
        TestRunnable tr = new TestRunnable(s);
        Thread t = new Thread(tr);
        System.out.println("調(diào)用線程1");
        tt.start();
        System.out.println("調(diào)用線程2");
        t.start();
    }

結(jié)果圖片:

以上就是動力節(jié)點小編介紹的"Java多線程實例解析"的內(nèi)容,希望對大家有幫助,如有疑問,請在線咨詢,有專業(yè)老師隨時為您服務(wù)。

提交申請后,顧問老師會電話與您溝通安排學(xué)習(xí)

免費課程推薦 >>
技術(shù)文檔推薦 >>
主站蜘蛛池模板: 久久午夜一区二区 | 国产亚洲玖玖玖在线观看 | 国产精品一区二区在线观看 | 亚洲黄色片视频 | 五月天婷亚洲 | 欧美日韩国产在线观看 | 国产毛片一级 | 久久www免费人成_看片美女图 | 色综合天天综合网国产国产人 | 熊出没之重启未来免费观看 | 亚洲欧美日韩精品香蕉 | 天天狠狠弄夜夜狠狠躁·太爽了 | 日b黄色| 国产精品成人久久久久 | 国产精品久久久久久影视 | 日韩欧美在线一级一中文字暮 | 在线黄色影院 | 美女视频黄视大全视频免费网址 | 久久99综合| 亚洲国产成人久久精品hezyo | 一本伊在人香蕉线观新在线 | 中国一级特黄高清免费的大片 | 亚洲国产精品毛片∧v卡在线 | 欧美亚洲国产另类在线观看 | 在线视频不卡国产在线视频不卡 | 色拍自拍亚洲综合在线 | 丹武至尊在线观看动漫 | 一区二区三区四区产品乱码伦 | 男女羞羞网站 | 日本中文字幕在线观看视频 | jizzjizz欧美69巨大 | 中文久久 | 久久伊人成人网 | 亚洲三级在线免费观看 | 看一级毛片 | 天天夜夜操| 国产精品国产国产aⅴ | 女人zzzooooxxxx| 亚洲综合香蕉 | 精品国产品香蕉在线 | aaa国产一级毛片 |