成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Java多線程:Java多線程執(zhí)行框架

silencezwm / 2861人閱讀

摘要:線程執(zhí)行框架啟動(dòng)線程將要多線程執(zhí)行的任務(wù)封裝為一個(gè)對(duì)象將其傳給一個(gè)執(zhí)行框架對(duì)象從線程池中選擇線程執(zhí)行工作任務(wù)。

為什么需要執(zhí)行框架呢?
使用一般的new方法來創(chuàng)建線程有什么問題呢?一般的new線程的方式一般要給出一個(gè)實(shí)現(xiàn)了Runnable接口的執(zhí)行類,在其中重寫run()方法,然后再在將這個(gè)執(zhí)行類的對(duì)象傳給線程以完成初始化,這個(gè)過程中線程的定義和執(zhí)行過程其實(shí)是雜糅在一起了,而且每次new一個(gè)新的線程出來在資源上很有可能會(huì)產(chǎn)生不必要的消耗,因此我們通過多線程執(zhí)行框架來解決這兩個(gè)問題,其一可以分離線程的定義和執(zhí)行過程,其二可以通過線程池來動(dòng)態(tài)地管理線程以減小不必要的資源開銷。

線程執(zhí)行框架啟動(dòng)線程
將要多線程執(zhí)行的任務(wù)封裝為一個(gè)Runnable對(duì)象,將其傳給一個(gè)執(zhí)行框架Executor對(duì)象, Executor從線程池中選擇線程執(zhí)行工作任務(wù)。

創(chuàng)建多線程框架對(duì)象調(diào)用線程執(zhí)行任務(wù)
我們通常通過Executors類的一些靜態(tài)方法來實(shí)例化Executor或ThreadPoolExecutor對(duì)象:

比如Executor對(duì)象來執(zhí)行:

public class ThreadTest {
    public static void main(String[] args) {
        Executor executor = Executors.newSingleThreadExecutor();
        executor.execute(new MyRunnable());
    }
}

class MyRunnable implements Runnable {
    @Override
    public void run() {
        System.out.println("running");
    }
}

比如線程池的Executor對(duì)象來執(zhí)行:

public class ThreadTest {
    public static void main(String[] args) {
        ThreadPoolExecutor executor = (ThreadPoolExecutor) Executors
                .newFixedThreadPool(3);
        executor.execute(new MyRunnable());
    }
}

class MyRunnable implements Runnable {
    @Override
    public void run() {
        System.out.println("running");
    }
}

Executors. newSingleThreadExecutor():一 個(gè)線程死掉后,自動(dòng)重新創(chuàng)建后一個(gè)新的線程,所以沒有線程池的概念,不能被ThreadPoolExecutor接收;

Executors. newFixedThreadPool():固定數(shù)目的線程池;

Executors. newCachedThreadPool():動(dòng)態(tài)地增加和減少線程數(shù);

多線程框架對(duì)象調(diào)用線程執(zhí)行任務(wù)取回結(jié)果
實(shí)現(xiàn)了Runnable接口的執(zhí)行類雖然可以在run()方法里寫入執(zhí)行體,但是無法返回結(jié)果值,因?yàn)閞un()方法是void型的,而Callable接口解決了這個(gè)問題,在繼承了Callable接口的執(zhí)行類中重寫call()方法可以設(shè)置返回值,當(dāng)Executor對(duì)象使用submit()函數(shù)提交執(zhí)行類的時(shí)候會(huì)由線程池里的線程來運(yùn)行,運(yùn)行得到的返回值可以使用Future接口來接,取得的返回值類型由V決定,F(xiàn)uture接口表示可能會(huì)得到的返回值,但是有可能報(bào)異常,因此要拋出這些異常,然后可以取得這些返回值。

public class ThreadTest {
    public static void main(String[] args) throws InterruptedException,
            ExecutionException {
        ThreadPoolExecutor executor = (ThreadPoolExecutor) Executors
                .newCachedThreadPool();
        MyCallable myCallable = new MyCallable(2);
        Future result = executor.submit(myCallable);
        System.out.println(result.get());
    }
}

class MyCallable implements Callable {
    private int num;

    public MyCallable(int num) {
        this.num = num;
    }

    @Override
    public Integer call() throws Exception {
        return num * 2;
    }
}

多線程框架對(duì)象調(diào)用線程執(zhí)行任務(wù)完成第一個(gè)還是全部完成就取回結(jié)果
使用submit()函數(shù)取回的結(jié)果不能控制任務(wù)是完成第一個(gè)還是全部完成就取回結(jié)果,然而使用invokeAny()和invokeAll()函數(shù)即可獲得這樣的效果,將執(zhí)行體對(duì)象放入集合中傳入這兩個(gè)函數(shù),前者可以在完成任務(wù)的多線程有一個(gè)(第一個(gè))完成時(shí)就返回結(jié)果,因此結(jié)果類型是單結(jié)果,而后者則需要等待所有執(zhí)行任務(wù)的線程都執(zhí)行完畢才返回結(jié)果,因此結(jié)果仍是集合。

1.invokeAny():

public class ThreadTest {
    public static void main(String[] args) throws InterruptedException, ExecutionException {
ThreadPoolExecutor executor = (ThreadPoolExecutor) Executors.newFixedThreadPool(5);
List callables = new ArrayList<>();
for(int i=0;i<10;i++){
MyCallable myCallable = new MyCallable(i);
callables.add(myCallable);
}
Integer res = executor.invokeAny(callables);
System.out.println(res);

}
}

class MyCallable implements Callable {
    private int num;

    public MyCallable(int num) {
        this.num = num;
    }

    @Override
    public Integer call() throws Exception {
        System.out.println(Thread.currentThread().getName() + " is running");
        return num * 2;
    }
}

2.invokeAll():

public class ThreadTest {
    public static void main(String[] args) throws InterruptedException,
            ExecutionException {
        ThreadPoolExecutor executor = (ThreadPoolExecutor) Executors
                .newFixedThreadPool(5);
        List callables = new ArrayList();
        for (int i = 0; i < 10; i++) {
            MyCallable myCallable = new MyCallable(i);
            callables.add(myCallable);
        }
        List> res = executor.invokeAll(callables);
        for (Future future : res) {
            System.out.println(future.get());
        }
    }
}

class MyCallable implements Callable {
    private int num;

    public MyCallable(int num) {
        this.num = num;
    }

    @Override
    public Integer call() throws Exception {
        System.out.println(Thread.currentThread().getName() + " is running");
        return num * 2;
    }
}

多線程框架對(duì)象執(zhí)行定時(shí)任務(wù)
使用Executor的schedule()函數(shù)族來調(diào)度線程池中的線程來執(zhí)行callable執(zhí)行類對(duì)象中的call()定時(shí)任務(wù):

public class ThreadTest {
    public static void main(String[] args) throws InterruptedException,
            ExecutionException {
        ScheduledExecutorService executorService = Executors
                .newScheduledThreadPool(2);
        MyCallable callable = new MyCallable(2);
        executorService.schedule(callable, 10, TimeUnit.SECONDS);
        executorService.shutdown();
    }
}

class MyCallable implements Callable {
    private int num;

    public MyCallable(int num) {
        this.num = num;
    }

    @Override
    public Integer call() throws Exception {
        System.out.println(Thread.currentThread().getName() + " is running");
        return num * 2;
    }
}

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/64616.html

相關(guān)文章

  • JAVA 線程和并發(fā)基礎(chǔ)

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

    vboy1010 評(píng)論0 收藏0
  • JAVA 線程和并發(fā)基礎(chǔ)面試問答

    摘要:多線程和并發(fā)問題是技術(shù)面試中面試官比較喜歡問的問題之一。線程可以被稱為輕量級(jí)進(jìn)程。一個(gè)守護(hù)線程是在后臺(tái)執(zhí)行并且不會(huì)阻止終止的線程。其他的線程狀態(tài)還有,和。上下文切換是多任務(wù)操作系統(tǒng)和多線程環(huán)境的基本特征。 多線程和并發(fā)問題是 Java 技術(shù)面試中面試官比較喜歡問的問題之一。在這里,從面試的角度列出了大部分重要的問題,但是你仍然應(yīng)該牢固的掌握J(rèn)ava多線程基礎(chǔ)知識(shí)來對(duì)應(yīng)日后碰到的問題。(...

    dreamans 評(píng)論0 收藏0
  • Java線程進(jìn)階(一)—— J.U.C并發(fā)包概述

    摘要:整個(gè)包,按照功能可以大致劃分如下鎖框架原子類框架同步器框架集合框架執(zhí)行器框架本系列將按上述順序分析,分析所基于的源碼為。后,根據(jù)一系列常見的多線程設(shè)計(jì)模式,設(shè)計(jì)了并發(fā)包,其中包下提供了一系列基礎(chǔ)的鎖工具,用以對(duì)等進(jìn)行補(bǔ)充增強(qiáng)。 showImg(https://segmentfault.com/img/remote/1460000016012623); 本文首發(fā)于一世流云專欄:https...

    anonymoussf 評(píng)論0 收藏0
  • 想進(jìn)大廠?50個(gè)線程面試題,你會(huì)少?【后25題】(二)

    摘要:大多數(shù)待遇豐厚的開發(fā)職位都要求開發(fā)者精通多線程技術(shù)并且有豐富的程序開發(fā)調(diào)試優(yōu)化經(jīng)驗(yàn),所以線程相關(guān)的問題在面試中經(jīng)常會(huì)被提到。掌握了這些技巧,你就可以輕松應(yīng)對(duì)多線程和并發(fā)面試了。進(jìn)入等待通行準(zhǔn)許時(shí),所提供的對(duì)象。 最近看到網(wǎng)上流傳著,各種面試經(jīng)驗(yàn)及面試題,往往都是一大堆技術(shù)題目貼上去,而沒有答案。 不管你是新程序員還是老手,你一定在面試中遇到過有關(guān)線程的問題。Java語言一個(gè)重要的特點(diǎn)就...

    caozhijian 評(píng)論0 收藏0
  • Java線程學(xué)習(xí)(八)線程池與Executor 框架

    摘要:一使用線程池的好處線程池提供了一種限制和管理資源包括執(zhí)行一個(gè)任務(wù)。每個(gè)線程池還維護(hù)一些基本統(tǒng)計(jì)信息,例如已完成任務(wù)的數(shù)量。通過重復(fù)利用已創(chuàng)建的線程降低線程創(chuàng)建和銷毀造成的消耗。使用無界隊(duì)列作為線程池的工作隊(duì)列會(huì)對(duì)線程池帶來的影響與相同。 歷史優(yōu)質(zhì)文章推薦: Java并發(fā)編程指南專欄 分布式系統(tǒng)的經(jīng)典基礎(chǔ)理論 可能是最漂亮的Spring事務(wù)管理詳解 面試中關(guān)于Java虛擬機(jī)(jvm)的問...

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

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

0條評(píng)論

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