国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

java 多線程

sutaking / 2291人閱讀

摘要:的多線程有好幾種,可以繼承,也可以實(shí)現(xiàn)接口,還可以實(shí)現(xiàn)接口繼承,自己實(shí)現(xiàn)方法,就可以定一個(gè)線程類,調(diào)用就可以在一個(gè)新的線程里面調(diào)用方法,如果需要等待線程結(jié)束,可以調(diào)用方法和差不多,只不過(guò)不直接繼承,而是實(shí)現(xiàn)接口只有一個(gè)方法,使用上面用這個(gè)去

java 的多線程有好幾種,可以繼承 Thread,也可以實(shí)現(xiàn) Runnable 接口,還可以實(shí)現(xiàn) Callable 接口

Thread
class MyThread extends Thread {
    private String name;

    public MyThread(String name) {
        this.name = name;
    }

    @Override
    public void run() {
        for (int i = 0; i < 5; i++) {
            try {
                Thread.sleep(100L);
            } catch (Exception e) {
                e.printStackTrace();
            }
            System.out.printf("%s is running %d
", name, i);
        }
    }
}

{
    Thread t1 = new MyThread("t1");
    Thread t2 = new MyThread("t2");

    t1.start();
    t2.start();
    try {
        t1.join();
        t2.join();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

繼承 Thread,自己實(shí)現(xiàn) run 方法,就可以定一個(gè)線程類,調(diào)用 start 就可以在一個(gè)新的線程里面調(diào)用 run 方法,如果需要等待線程結(jié)束,可以調(diào)用 join 方法

Runnable
class MyRunnable implements Runnable {
    private String name;

    public MyRunnable(String name) {
        this.name = name;
    }

    @Override
    public void run() {
        for (int i = 0; i < 5; i++) {
            try {
                Thread.sleep(100L);
            } catch (Exception e) {
                e.printStackTrace();
            }
            System.out.printf("%s is running %d
", name, i);
        }
    }
}

{
    Thread r1 = new Thread(new MyRunnable("r1"));
    Thread r2 = new Thread(new MyRunnable("r2"));

    r1.start();
    r2.start();
    try {
        r1.join();
        r2.join();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

和 Thread 差不多,只不過(guò)不直接繼承 Thread,而是實(shí)現(xiàn) Runnable 接口(Runable 只有一個(gè) run 方法),使用上面用這個(gè) Runnable 去構(gòu)造一個(gè) Thread,這種方式相對(duì)直接繼承 Thread 的方式要更加靈活,因?yàn)?java 是單繼承,如果繼承了 Thread 就不能再繼承別的類

事實(shí)上,建議永遠(yuǎn)不要直接繼承 Thread 類,因?yàn)閺恼Z(yǔ)義上來(lái)講,Thread 也應(yīng)該也只是方法運(yùn)行的方式,你的類應(yīng)該是可以在這種方式下運(yùn)行,而不是一種 Thread 對(duì)象,從這個(gè)角度講,Runnable 提供了更好的語(yǔ)義,用一個(gè) Thread 對(duì)象去運(yùn)行一個(gè) Runable

Callable
class MyCallable implements Callable {
    private Random random;

    public MyCallable() {
        this.random = new Random();
    }

    @Override
    public Integer call() throws Exception {
        Thread.sleep(100L);
        return this.random.nextInt();
    }
}

{
    FutureTask future1 = new FutureTask<>(new MyCallable());
    FutureTask future2 = new FutureTask<>(new MyCallable());
    new Thread(future1).start();
    new Thread(future2).start();

    try {
        System.out.println(future1.get(50, TimeUnit.MILLISECONDS));
    } catch (TimeoutException e) {
        System.out.println("future1 timeout");
    } catch (Exception e) {
        e.printStackTrace();
    }

    try {
        System.out.println(future2.get());
    } catch (Exception e) {
        e.printStackTrace();
    }
}

Callable 接口也只有一個(gè)方法 call,和 Runnable 不同的是 Callable 允許有返回值,而這個(gè)返回值可以通過(guò) FutureTask.get 獲取,還可以設(shè)置任務(wù)運(yùn)行的超時(shí)時(shí)間,超時(shí)后會(huì)拋出一個(gè)異常

ThreadPool
class MyCallable implements Callable {
    private Random random;

    public MyCallable() {
        this.random = new Random();
    }

    @Override
    public Integer call() throws Exception {
        Thread.sleep(100L);
        return this.random.nextInt();
    }
}

{
    ExecutorService es = Executors.newFixedThreadPool(5);
    Future future1 = es.submit(new MyCallable());
    Future future2 = es.submit(new MyCallable());

    try {
        System.out.println(future1.get(50, TimeUnit.MILLISECONDS));
    } catch (TimeoutException e) {
        System.out.println("future1 timeout");
    } catch (Exception e) {
        e.printStackTrace();
    }

    try {
        System.out.println(future2.get());
    } catch (Exception e) {
        e.printStackTrace();
    }

    es.shutdown();
}

java 里面線程的創(chuàng)建和銷毀成本比較大,所以一般會(huì)需要放到線程池里面跑,java 的基礎(chǔ)設(shè)施就是好,這些在標(biāo)準(zhǔn)庫(kù)里面都有實(shí)現(xiàn),使用上面也很簡(jiǎn)單,直接 new 出一個(gè)線程池就好了,然后就可以往里面 submit Callable 對(duì)象,線程池也有很多種,上面用到的 newFixedThreadPool 是固定線程數(shù)的線程池,下面用到的 newCachedThreadPool 在線程不夠用的時(shí)候會(huì)創(chuàng)建新線程,同時(shí)也會(huì)不斷復(fù)用之前創(chuàng)建的線程

{
    ExecutorService es = Executors.newCachedThreadPool();
    CompletionService cs = new ExecutorCompletionService<>(es);
    cs.submit(new MyCallable());
    cs.submit(new MyCallable());
    cs.submit(new MyCallable());
    cs.submit(new MyCallable());

    try {
        System.out.println(cs.take().get());
        System.out.println(cs.take().get());
        System.out.println(cs.take().get());
        System.out.println(cs.take().get());
    } catch (Exception e) {
        e.printStackTrace();
    }

    es.shutdown();
}

典型的生成者消費(fèi)者模型里面,我們需要把生產(chǎn)的結(jié)果放到一個(gè)隊(duì)列里面,而消費(fèi)者從這個(gè)隊(duì)列里面不斷地去消費(fèi),ExecutorCompletionService 就相當(dāng)于這個(gè)隊(duì)列,MyCallable 的結(jié)果會(huì)寫入到緩存里面,使用 cs.take().get() 從里面取出結(jié)果

總結(jié)

線程的創(chuàng)建,銷毀,切換在 java 里面都是耗性能的操作,如果有需求要大量地創(chuàng)建線程,盡量使用線程池去復(fù)用線程

參考鏈接

測(cè)試代碼鏈接:https://github.com/hatlonely/...

“implements Runnable” vs. “extends Thread” :https://stackoverflow.com/que...

轉(zhuǎn)載請(qǐng)注明出處 
本文鏈接:http://hatlonely.com/2018/03/...

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/68835.html

相關(guān)文章

  • Java線程學(xué)習(xí)(一)Java線程入門

    摘要:最近聽很多面試的小伙伴說(shuō),網(wǎng)上往往是一篇一篇的多線程的文章,除了書籍沒(méi)有什么學(xué)習(xí)多線程的一系列文章。將此線程標(biāo)記為線程或用戶線程。 最近聽很多面試的小伙伴說(shuō),網(wǎng)上往往是一篇一篇的Java多線程的文章,除了書籍沒(méi)有什么學(xué)習(xí)多線程的一系列文章。但是僅僅憑借一兩篇文章很難對(duì)多線程有系統(tǒng)的學(xué)習(xí),而且面試的時(shí)候多線程這方面的知識(shí)往往也是考察的重點(diǎn),所以考慮之下決定寫一系列關(guān)于Java多線程的文章...

    Donne 評(píng)論0 收藏0
  • Java線程專題一:并發(fā)所面臨的問(wèn)題

    摘要:但是并不是什么多線程就可以隨便用,有的時(shí)候多線程反而會(huì)造成系統(tǒng)的負(fù)擔(dān),而且多線程還會(huì)造成其他的數(shù)據(jù)問(wèn)題,下面就來(lái)介紹一下多線程面臨的問(wèn)題。下面這張圖是多線程運(yùn)行時(shí)候的情況,我們發(fā)現(xiàn)上下文切換的次數(shù)暴增。 并發(fā)的概念: 在Java中是支持多線程的,多線程在有的時(shí)候可以大提高程序的速度,比如你的程序中有兩個(gè)完全不同的功能操作,你可以讓兩個(gè)不同的線程去各自執(zhí)行這兩個(gè)操作,互不影響,不需要執(zhí)行...

    madthumb 評(píng)論0 收藏0
  • Java線程可以分組,還能這樣玩!

    摘要:如圖所示,帶有的所有線程構(gòu)造方法都可以定義線程組的。線程組還能統(tǒng)一設(shè)置組內(nèi)所有線程的最高優(yōu)先級(jí),線程單獨(dú)設(shè)置的優(yōu)先級(jí)不會(huì)高于線程組設(shè)置的最大優(yōu)先級(jí)。 前面的文章,棧長(zhǎng)和大家分享過(guò)多線程創(chuàng)建的3種方式《實(shí)現(xiàn) Java 多線程的 3 種方式》。 但如果線程很多的情況下,你知道如何對(duì)它們進(jìn)行分組嗎? 和 Dubbo 的服務(wù)分組一樣,Java 可以對(duì)相同性質(zhì)的線程進(jìn)行分組。 來(lái)看下線程類 Th...

    biaoxiaoduan 評(píng)論0 收藏0
  • JAVA 線程和并發(fā)基礎(chǔ)

    摘要:線程可以被稱為輕量級(jí)進(jìn)程。一個(gè)守護(hù)線程是在后臺(tái)執(zhí)行并且不會(huì)阻止終止的線程。其他的線程狀態(tài)還有,和。上下文切換是多任務(wù)操作系統(tǒng)和多線程環(huán)境的基本特征。在的線程中并沒(méi)有可供任何對(duì)象使用的鎖和同步器。 原文:Java Multi-Threading and Concurrency Interview Questions with Answers 翻譯:并發(fā)編程網(wǎng) - 鄭旭東 校對(duì):方騰飛 多...

    vboy1010 評(píng)論0 收藏0
  • Java線程學(xué)習(xí)(七)并發(fā)編程中一些問(wèn)題

    摘要:相比與其他操作系統(tǒng)包括其他類系統(tǒng)有很多的優(yōu)點(diǎn),其中有一項(xiàng)就是,其上下文切換和模式切換的時(shí)間消耗非常少。因?yàn)槎嗑€程競(jìng)爭(zhēng)鎖時(shí)會(huì)引起上下文切換。減少線程的使用。很多編程語(yǔ)言中都有協(xié)程。所以如何避免死鎖的產(chǎn)生,在我們使用并發(fā)編程時(shí)至關(guān)重要。 系列文章傳送門: Java多線程學(xué)習(xí)(一)Java多線程入門 Java多線程學(xué)習(xí)(二)synchronized關(guān)鍵字(1) java多線程學(xué)習(xí)(二)syn...

    dingding199389 評(píng)論0 收藏0
  • 學(xué)習(xí)Java線程的一些總結(jié)

    摘要:多線程環(huán)境下的一些問(wèn)題安全性問(wèn)題在沒(méi)有正確同步的情況下,多線程環(huán)境下程序可能得出錯(cuò)誤的結(jié)果。一些相關(guān)概念競(jìng)爭(zhēng)條件多線程的環(huán)境下,程序執(zhí)行的結(jié)果取決于線程交替執(zhí)行的方式。而線程的交替操作順序是不可預(yù)測(cè)的,如此程序執(zhí)行的結(jié)果也是不可預(yù)測(cè)的。 入口 Java多線程的應(yīng)用復(fù)雜性之如jvm有限的幾個(gè)內(nèi)存方面的操作和規(guī)范,就像無(wú)數(shù)紛繁復(fù)雜的應(yīng)用邏輯建立在有限的指令集上。 如何寫出線程安全的程序,有...

    coolpail 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<