關(guān)于java多線程的創(chuàng)建及啟動(dòng)介紹-創(chuàng)新互聯(lián)

今天小編給大家分享的是關(guān)于java多線程的創(chuàng)建及啟動(dòng)介紹,很多人都不太了解,今天小編為了讓大家更加了解java多線程,所以給大家總結(jié)了以下內(nèi)容,一起往下看吧。一定會(huì)有所收獲的哦

在漢源等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場(chǎng)前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供做網(wǎng)站、成都網(wǎng)站制作 網(wǎng)站設(shè)計(jì)制作定制網(wǎng)站開(kāi)發(fā),公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),成都品牌網(wǎng)站建設(shè),全網(wǎng)整合營(yíng)銷(xiāo)推廣,成都外貿(mào)網(wǎng)站制作,漢源網(wǎng)站建設(shè)費(fèi)用合理。

關(guān)于java多線程的創(chuàng)建及啟動(dòng)介紹

Java中線程的創(chuàng)建常見(jiàn)有如三種基本形式:

一、繼承Thread類,重寫(xiě)該類的run()方法

繼承Thread類,重寫(xiě)該類的run()方法

public class MyThread extends Thread{
    @Override
    public void run() {
        for (int i = 0 ;i < 50;i++) {
            System.out.println(Thread.currentThread().getName() + ":" + i);
        }
    }
    public static void main(String[] args) {
        for (int i = 0;i<50;i++) {
            //調(diào)用Thread類的currentThread()方法獲取當(dāng)前線程
            System.out.println(Thread.currentThread().getName() + " " + i);
            if (i == 10) {
                new MyThread().start();
                new MyThread().start(); 
            }
        }
    }
}

運(yùn)行結(jié)果:

...
main 48
main 49
Thread-0:0
Thread-0:1
Thread-0:2
Thread-0:3
Thread-0:4
Thread-1:0
...

從結(jié)果中可以看出:

1、有三個(gè)線程:main、Thread-0 、Thread-1;

2、Thread-0 、Thread-1兩個(gè)線程輸出的成員變量 i 的值不連續(xù)(這里的 i 是實(shí)例變量而不是局部變量)。因?yàn)椋和ㄟ^(guò)繼承Thread類實(shí)現(xiàn)多線程時(shí),每個(gè)線程的創(chuàng)建都要?jiǎng)?chuàng)建不同的子類對(duì)象,導(dǎo)致Thread-0 、Thread-1兩個(gè)線程不能共享成員變量 i ;

3、線程的執(zhí)行是搶占式,并沒(méi)有說(shuō)Thread-0 或者Thread-1一直占用CPU(這也與線程優(yōu)先級(jí)有關(guān),這里Thread-0 、Thread-1線程優(yōu)先級(jí)相同,關(guān)于線程優(yōu)先級(jí)的知識(shí)這里不做展開(kāi))

(學(xué)習(xí)視頻推薦:java視頻教程)

二、通過(guò)實(shí)現(xiàn)Runnable接口創(chuàng)建線程類

定義一個(gè)類實(shí)現(xiàn)Runnable接口;創(chuàng)建該類的實(shí)例對(duì)象obj;將obj作為構(gòu)造器參數(shù)傳入Thread類實(shí)例對(duì)象,這個(gè)對(duì)象才是真正的線程對(duì)象。

public class MyRunnable implements Runnable {
    @Override
    public void run() {
        for (int i = 0 ;i < 50 ;i++) {
            System.out.println(Thread.currentThread().getName()+":" +i);
        }
    }

    public static void main(String[] args) {
       for (int i = 0;i < 50;i++) {
            System.out.println(Thread.currentThread().getName() + ":" +i);
            if (i == 10) {
                MyRunnable myRunnable = new MyRunnable();
                new Thread(myRunnable).start();
                new Thread(myRunnable).start();
            }
        }
        //java8 labdam方式
         new Thread(() -> {
            System.out.println(Thread.currentThread().getName());
        },"線程3").start();
    }
}

運(yùn)行結(jié)果:

...
main:46
main:47
main:48
main:49
Thread-0:28
Thread-0:29
Thread-0:30
Thread-1:30
...

1、線程1和線程2輸出的成員變量i是連續(xù)的,也就是說(shuō)通過(guò)這種方式創(chuàng)建線程,可以使多線程共享線程類的實(shí)例變量,因?yàn)檫@里的多個(gè)線程都使用了同一個(gè)target實(shí)例變量。但是,當(dāng)你使用上述的代碼運(yùn)行的時(shí)候,你會(huì)發(fā)現(xiàn),其實(shí)結(jié)果有些并不連續(xù),這是因?yàn)槎鄠€(gè)線程訪問(wèn)同一資源時(shí),如果資源沒(méi)有加鎖,那么會(huì)出現(xiàn)線程安全問(wèn)題;

2、java8 可以使用lambda方式創(chuàng)建多線程。

三、通過(guò)Callable和Future接口創(chuàng)建線程

創(chuàng)建Callable接口實(shí)現(xiàn)類,并實(shí)現(xiàn)call()方法,該方法將作為線程執(zhí)行體,且該方法有返回值,再創(chuàng)建Callable實(shí)現(xiàn)類的實(shí)例;使用FutureTask類來(lái)包裝Callable對(duì)象,該FutureTask對(duì)象封裝了該Callable對(duì)象的call()方法的返回值;使用FutureTask對(duì)象作為T(mén)hread對(duì)象的target創(chuàng)建并啟動(dòng)新線程;調(diào)用FutureTask對(duì)象的get()方法來(lái)獲得子線程執(zhí)行結(jié)束后的返回值。

public class MyCallable implements Callable<Integer> {
    private int i = 0;
    @Override
    public Integer call() throws Exception {
        int sum = 0;
        for (; i < 100; i++) {
            System.out.println(Thread.currentThread().getName() + " " + i);
            sum += i;
        }
        return sum;
    }

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        // 創(chuàng)建MyCallable對(duì)象
        Callable<Integer> myCallable = new MyCallable();
        //使用FutureTask來(lái)包裝MyCallable對(duì)象
        FutureTask<Integer> ft = new FutureTask<Integer>(myCallable);
        for (int i = 0;i<50;i++) {
            System.out.println(Thread.currentThread().getName() + ":" + i);
            if (i == 30) {
                Thread thread = new Thread(ft);
                thread.start();
            }
        }
        System.out.println("主線程for循環(huán)執(zhí)行完畢..");
        Integer integer = ft.get();
        System.out.println("sum = "+ integer);
    }
}

call()方法的返回值類型與創(chuàng)建FutureTask對(duì)象時(shí)<>里的類型一致。

以上就是關(guān)于java多線程的創(chuàng)建及啟動(dòng)的簡(jiǎn)略介紹,當(dāng)然詳細(xì)使用上面的不同還得要大家自己使用過(guò)才領(lǐng)會(huì)。如果想了解更多,歡迎關(guān)注創(chuàng)新互聯(lián)成都網(wǎng)站設(shè)計(jì)公司行業(yè)資訊頻道哦!

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。

當(dāng)前題目:關(guān)于java多線程的創(chuàng)建及啟動(dòng)介紹-創(chuàng)新互聯(lián)
URL分享:http://www.muchs.cn/article46/dhoshg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)網(wǎng)站建設(shè)、外貿(mào)建站、網(wǎng)站改版、企業(yè)建站、全網(wǎng)營(yíng)銷(xiāo)推廣、定制開(kāi)發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

綿陽(yáng)服務(wù)器托管