欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

java中的線程怎么理解

這篇文章主要介紹“java中的線程怎么理解”的相關(guān)知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強(qiáng),希望這篇“java中的線程怎么理解”文章能幫助大家解決問題。

專注于為中小企業(yè)提供網(wǎng)站建設(shè)、網(wǎng)站設(shè)計服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)鼓樓免費做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動了成百上千家企業(yè)的穩(wěn)健成長,幫助中小企業(yè)通過網(wǎng)站建設(shè)實現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。

java中的線程怎么理解

線程(thread)是一個程序內(nèi)部的一條執(zhí)行路徑,我們所熟悉的main方法其實就是一條單獨執(zhí)行路徑,若程序中只有一條執(zhí)行路徑那么這個程序就是單線程程序;既然有單線程,那么也相對的會有多線程,字面意思可以理解為“相對單線程從軟硬件上多條執(zhí)行流程的技術(shù)”,多線程的好處是提高CPU的利用率。 在多線程程序中,一個線程必須等待的時候,CPU可以運行其它的線程而不是等待,大大提高程序的效率。

多線程的創(chuàng)建

方式一:繼承Thread類

方式一創(chuàng)建過程:

  • 定義一個子類MyThread繼承線程類java.lang.Thread,重寫run()方法;

  • 創(chuàng)建MyThread類的對象;

  • 調(diào)用線程對象的start()方法啟動線程(啟動后仍然執(zhí)行run()方法);

    public class ThreadDemo01 {
        public static void main(String[] args) {
            MyThread myThread1 = new MyThread();
            myThread1.start();
            for (int i = 0; i < 3; i++) {
                System.out.println("主線程正在執(zhí)行~~");
            }
        }
    }
    class MyThread extends Thread{
        @Override
        public void run() {
            for (int i = 0; i < 3; i++) {
                System.out.println("子線程正在執(zhí)行~~");
            }
    
        }
    }
    //輸出結(jié)果(不唯一):
    //主線程正在執(zhí)行~~
    //主線程正在執(zhí)行~~
    //主線程正在執(zhí)行~~
    //子線程正在執(zhí)行~~
    //子線程正在執(zhí)行~~
    //子線程正在執(zhí)行~~
  • 在以上代碼中共有兩個線程在執(zhí)行,分別是main方法的主線程和線程對象mythread調(diào)用start()啟動的子線程。不過輸出結(jié)果為什么會不唯一的呢?原因是因為兩個線程在執(zhí)行過程中會發(fā)生CPU的搶占,誰先搶到誰將優(yōu)先執(zhí)行。

那么我們?yōu)槭裁床恢苯邮褂镁€程對象調(diào)用run()方法呢?若直接調(diào)用run()則只是普通的調(diào)用方法,即單線程,而start()方法則是用來啟動的子線程的,由此才能出現(xiàn)多線程。

方式一優(yōu)缺點:

  • 優(yōu)點:編碼簡單;

  • 缺點:線程類已經(jīng)繼承Thread,無法繼承其他類,不利于擴(kuò)展;

方式二: 實現(xiàn)Runnable接口

方式二創(chuàng)建過程:

1、定義一個線程任務(wù)類MyRunnable實現(xiàn)Runnable接口,重寫run()方法;

2、創(chuàng)建MyRunnable對象;

3、把MyRunnable任務(wù)對象交給Thread處理;

4、調(diào)用線程對象的start()方法啟動線程;

Thread構(gòu)造器方法
public Thread (String name)可以為當(dāng)前線程指定名稱
public Thread (Runnable target)封裝Runnable對象成為線程對象
public Thread (Runnable target ,String name)封裝Runnable對象成為線程對象,并指定線程名稱
public class ThreadDemo02 {
    public static void main(String[] args) {
        MyRunnable target = new MyRunnable();
        Thread thread = new Thread(target);
        thread.start();
        for (int i = 0; i < 3; i++) {
            System.out.println("主線程正在執(zhí)行~~");
        }
    }
}
class MyRunnable implements Runnable{
    @Override
    public void run() {
        for (int i = 0; i < 3; i++) {
            System.out.println("子線程正在執(zhí)行~~");
        }

    }
}
//輸出結(jié)果(不唯一):
//主線程正在執(zhí)行~~
//子線程正在執(zhí)行~~
//子線程正在執(zhí)行~~
//子線程正在執(zhí)行~~
//主線程正在執(zhí)行~~
//主線程正在執(zhí)行~~

該代碼與方式一的不同之處在于需要將MyRunnable任務(wù)對象封裝在Thread中,其他的地方是基本上是沒有變化的。

方式二優(yōu)缺點:

優(yōu)點:線程任務(wù)類只是實現(xiàn)接口,可以繼續(xù)繼承類和實現(xiàn)接口,擴(kuò)展性強(qiáng);

缺點:編程多一層對象包裝,如果線程有執(zhí)行結(jié)果是不可以直接返回的。

接下來我們同樣使用實現(xiàn)Runnable接口(匿名內(nèi)部類形式)來實現(xiàn)多線程的創(chuàng)建:

1、創(chuàng)建Runnable匿名內(nèi)部類對象;

2、交給Thread處理;

3、調(diào)用線程對象的start()啟動線程;

//正常版:
public class ThreadDemo01 {
    public static void main(String[] args) {
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < 3; i++) {
                    System.out.println("子線程正在執(zhí)行~~");
                }
            }
        });
        thread.start();
        for (int i = 0; i < 3; i++) {
            System.out.println("主線程正在執(zhí)行~~");
        }
    }
}

//lambda簡化版:
new Thread(()-> {
                for (int i = 0; i < 3; i++) {
                    System.out.println("子線程正在執(zhí)行~~");
                }
        }).start();

該種方法從本質(zhì)上其實并沒有太大的區(qū)別只不過是一個需要創(chuàng)建線程對象,而另一個則是通過匿名內(nèi)部類實現(xiàn)的多線程。并且該塊代碼也可以通過lambda表達(dá)式進(jìn)行精簡,不知道大家是否還對這個知識點有印象呢?若忘記了可以看一下這篇文章:Java中的lambda表達(dá)式如何理解——精簡

方式三:實現(xiàn)Callable接口

在學(xué)習(xí)過前面兩種創(chuàng)建多線程的方式以后,我們會發(fā)現(xiàn)存在一個問題:1、重寫的run()方法不能直接返回結(jié)果;2、不適合需要返回線程執(zhí)行結(jié)果的業(yè)務(wù)場景。因此,我們需要第三種方式來解決這些問題。

方式三創(chuàng)建過程:

1、定義類實現(xiàn)Callable接口,重寫call()方法,封裝要做的事情;

2、用FutureTask把Callable對象封裝成線程任務(wù)對象;

3、把線程任務(wù)對象交給Thread處理;

4、調(diào)用Thread的start()方法啟動線程,執(zhí)行任務(wù);

5、線程執(zhí)行完畢后,通過FutureTask的get()方法獲取任務(wù)執(zhí)行的結(jié)果。

方法名稱說明
public FutureTask<>(Callable call)把Callable對象封裝成FutureTask對象
public V get() throws Exception獲取線程執(zhí)行call方法返回的結(jié)果
public class ThreadDemo03 {
    public static void main(String[] args) throws Exception {
        MyCallable myCallable = new MyCallable();
        FutureTask<String> futureTask = new FutureTask<>(myCallable);
        Thread thread = new Thread(futureTask);
        thread.start();
        int sum= 0;
        for (int i = 0; i < 3; i++) {
            sum+=i;
        }
        System.out.println(sum);
        String s =futureTask.get();
        System.out.println(s);
    }
}
class MyCallable implements Callable<String > {
    @Override
    public String call(){
        int sum=0;
        for (int i = 0; i < 3; i++) {
            sum+=i;
        }
        return "子線程計算結(jié)果:"+sum;
    }
}
//輸出結(jié)果:
//3
//子線程計算結(jié)果:3

方式三優(yōu)缺點:

優(yōu)點:

線程任務(wù)類只是實現(xiàn)接口,可以繼續(xù)繼承類和實現(xiàn)接口,擴(kuò)展性強(qiáng);

可以在線程執(zhí)行完畢后去獲取 線程執(zhí)行的結(jié)果;

缺點:

編碼復(fù)雜一點;

總結(jié)

方式優(yōu)點缺點
繼承Thread類編程比較簡單,可以直接使用Thread類中的方法擴(kuò)展性較差,不能再繼承其他的類,不能返回線程執(zhí)行的結(jié)果
實現(xiàn)Runnable接口擴(kuò)展性強(qiáng),實現(xiàn)該接口的同時還可以繼承其他的類編程相對復(fù)雜,不能返回線程執(zhí)行的結(jié)果
實現(xiàn)Callable接口擴(kuò)展性強(qiáng),實現(xiàn)該接口的同時還可以繼承其他的類,可以得到線程的執(zhí)行結(jié)果編程相對復(fù)雜

常用方法

Thread獲取和設(shè)置線程名稱

方法名稱說明
String getName()獲取當(dāng)前線程的名稱,默認(rèn)線程名稱是Thread-索引
void setName(String name)

將此線程更改為指定的名稱,通過構(gòu)造器也可以設(shè)置線程名稱

簡單地通過一段代碼讓大家能夠清晰地了解這個代碼該如何使用:

public class ThreadDemo04 {
    public static void main(String[] args) throws Exception {
        thread thread1 = new thread();
        thread1.setName("1號子線程");
        thread1.start();
        thread thread2 = new thread();
        thread2.setName("2號子線程");
        thread2.start();
    }
}
class thread extends Thread {
    @Override
    public void run() {
        for (int i = 0; i < 3; i++) {
            System.out.println(this.getName()+"正在執(zhí)行任務(wù)"+i);
        }
    }
}
//輸出結(jié)果:
//2號子線程正在執(zhí)行任務(wù)0
//1號子線程正在執(zhí)行任務(wù)0
//2號子線程正在執(zhí)行任務(wù)1
//1號子線程正在執(zhí)行任務(wù)1
//2號子線程正在執(zhí)行任務(wù)2
//1號子線程正在執(zhí)行任務(wù)2

Thread類的線程休眠方法

方法名稱說明
public static void sleep(long time)讓當(dāng)前線程休眠指定的時間后再繼續(xù)執(zhí)行,單位為毫秒
public class ThreadDemo05 {
    public static void main(String[] args) throws Exception {
        for (int i = 0; i < 5; i++) {
            System.out.println(i);
            if (i==3){
                Thread.sleep(5000);
            }
        }
    }
}
//輸出結(jié)果:
//1
//2
//3
//在輸出過3以后,等待5秒之后再進(jìn)行輸出
//4

關(guān)于“java中的線程怎么理解”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識,可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,小編每天都會為大家更新不同的知識點。

當(dāng)前標(biāo)題:java中的線程怎么理解
鏈接URL:http://chinadenli.net/article24/pipije.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)網(wǎng)站建設(shè)、靜態(tài)網(wǎng)站、用戶體驗網(wǎng)站排名、微信公眾號電子商務(wù)

廣告

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

網(wǎng)站優(yōu)化排名