并發(fā)

1.Runable與Thread#

Thread類是實(shí)現(xiàn)了Runable接口。

class TestRun implements Runnable {

    private int i = 0;
    @Override
    public void run() {
        while(i < 100) {
            i ++;
            System.out.println("run");
            Thread.yield();
        }
    }
}

public class Client {
    public static void main(String args[]) {
        /*Context context = new Context();
        context.setState(Context.concreteState1);
        context.handler2();
        context.handler1();*/
        TestRun tr = new TestRun();
        tr.run();
        Thread t = new Thread(new TestRun());
        //設(shè)置為后臺(tái)執(zhí)行
        t.setDaemon(true);
        //與主線程并發(fā)執(zhí)行
        t.start();
        
        System.out.println("main");
    }
}

2.Executors#

class TestRun implements Runnable {

    private int i = 0;
    private int n = 0;

    public TestRun(int n){
        this.n = n;
    }
    @Override
    public void run() {
        while(i < 100) {
            i ++;
            System.out.println("run" + n);
            Thread.yield();
        }
    }
}

public class Client {
    public static void main(String args[]) {
        //一個(gè)線程管理工具類
        //ExecutorService ex = Executors.newCachedThreadPool();
        //定義線程數(shù)量
        ExecutorService ex = Executors.newFixedThreadPool(3);
        for(int i = 0; i <= 5; i++) {
            ex.execute(new TestRun(i));
        }
        ex.shutdown();
    }
}

3.Callable#

Callable接口可以處理具有返回值的線程。只能通過ExecutorService.submit()函數(shù)啟動(dòng)

class TestCall implements Callable<String> {

    private StringBuilder sb = new StringBuilder("Callable");
    private int id;

    public TestCall(int id) {
        this.id = id;
    }

    @Override
    public String call() throws Exception {
        sb.append(id);
        return sb.toString();
    }
}

public class Client {
    public static void main(String args[]) {
        ExecutorService ex = Executors.newCachedThreadPool();
        ArrayList<Future<String>> results = new ArrayList<Future<String>>();
        for(int i = 0; i <= 1000; i++) {
            results.add(ex.submit(new TestCall(i)));
        }

        for(Future<String> fs : results) {
            try {
                System.out.println(fs.get());
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (ExecutionException e) {
                e.printStackTrace();
            } finally {
                ex.shutdown();
            }
        }
    }
}

4.共享資源#

//一個(gè)加鎖對(duì)象中某個(gè)加鎖方法被訪問,則整個(gè)對(duì)象被加鎖
synchronized void f() {}
synchronized void g() {}
//整個(gè)類被加鎖
synchronized static void t() {}

//顯示加鎖
lock.lock()
lock.unlock()
``
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 譯序 本指南根據(jù) Jakob Jenkov 最新博客翻譯,請(qǐng)隨時(shí)關(guān)注博客更新:http://tutorials.j...
    高廣超閱讀 5,459評(píng)論 1 68
  • 一.線程安全性 線程安全是建立在對(duì)于對(duì)象狀態(tài)訪問操作進(jìn)行管理,特別是對(duì)共享的與可變的狀態(tài)的訪問 解釋下上面的話: ...
    黃大大吃不胖閱讀 952評(píng)論 0 3
  • 一、并發(fā) 進(jìn)程:每個(gè)進(jìn)程都擁有自己的一套變量 線程:線程之間共享數(shù)據(jù) 1.線程 Java中為多線程任務(wù)提供了很多的...
    SeanMa閱讀 2,802評(píng)論 0 11
  • 原文鏈接 譯者:靖靖 并發(fā) 進(jìn)程和線程 在并發(fā)編程當(dāng)中,有兩個(gè)基本的執(zhí)行單元:進(jìn)程和線程。在java中,我們大部分...
    4b4f3ceb6f71閱讀 851評(píng)論 4 16
  • layout: posttitle: 《Java并發(fā)編程的藝術(shù)》筆記categories: Javaexcerpt...
    xiaogmail閱讀 6,006評(píng)論 1 19

友情鏈接更多精彩內(nèi)容