最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

深入探究Java線(xiàn)程的創(chuàng)建與構(gòu)造方法

 更新時(shí)間:2022年04月26日 10:08:17   作者:淡沫初夏Zz  
這篇文章主要給大家分享的是java線(xiàn)程的創(chuàng)建以及構(gòu)造方法,想了解具體方式的小伙伴可以參考下面文章內(nèi)容,希望對(duì)你有所幫助

一、創(chuàng)建線(xiàn)程

啟動(dòng)線(xiàn)程—start 方法

通過(guò)覆寫(xiě) run 方法創(chuàng)建?個(gè)線(xiàn)程對(duì)象,但線(xiàn)程對(duì)象被創(chuàng)建出來(lái)并不意味著線(xiàn)程就開(kāi)始運(yùn)行了

  • 覆寫(xiě)run方法是給線(xiàn)程指令清單
  • 但是start方法,則是讓線(xiàn)程去真正的執(zhí)行

方法一

繼承Thread類(lèi)

/**
 * 繼承Thread創(chuàng)建線(xiàn)程
 */
class MyThread1 extends Thread{
    @Override
    public void run() {
        //業(yè)務(wù)代碼
        Thread thread = Thread.currentThread();
        System.out.println("名稱(chēng):" + thread.getName());
    }
}
public class ThreadDemo1 {
    public static void main(String[] args) {
        //獲得當(dāng)前的線(xiàn)程
        Thread mainThread = Thread.currentThread();
        System.out.println("名稱(chēng):" + mainThread.getName());
        Thread thread = new MyThread1();
        //開(kāi)啟線(xiàn)程
        thread.start();
    }
}

因?yàn)?Java 是單繼承,繼承了 Thread 就不能繼承其他類(lèi)了,然而 Java 可以實(shí)現(xiàn)多個(gè)接口,于是有了下?種方式

方法二

實(shí)現(xiàn)Runnable接口

/**
 * 使用Runnable接口創(chuàng)建線(xiàn)程
 */
class MyThread2 implements Runnable{
    @Override
    public void run() {
        Thread thread = Thread.currentThread();//得到當(dāng)前線(xiàn)程
        System.out.println("名稱(chēng):" + thread.getName());
    }
}
public class ThreadDemo2 {
    public static void main(String[] args) {
        MyThread2 myThread2 = new MyThread2();
        //創(chuàng)建線(xiàn)程
        Thread thread = new Thread(myThread2);
        //啟動(dòng)線(xiàn)程
        thread.start();
    }
}

方法三

繼承Thread類(lèi)使用匿名內(nèi)部類(lèi)

/**
 * 繼承Thread使用匿名內(nèi)部類(lèi)創(chuàng)建
 */
public class ThreadDemo4 {
    public static void main(String[] args) {
        Thread thread = new Thread(){
            @Override
            public void run() {
//                業(yè)務(wù)代碼
                Thread thread2 = Thread.currentThread();
                System.out.println("名稱(chēng)" + thread2.getName());
            }
        };
        //開(kāi)始線(xiàn)程
        thread.start();

    }
}

方法四

實(shí)現(xiàn)Runnable接口,使用匿名內(nèi)部類(lèi)

/**
 * runnable使用匿名內(nèi)部類(lèi)創(chuàng)建
 */
public class ThreadDemo3 {
    public static void main(String[] args) {
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                //具體業(yè)務(wù)
                Thread thread1 = Thread.currentThread();
                System.out.println("名稱(chēng):" + thread1.getName());
            }
        });
        //開(kāi)啟線(xiàn)程
        thread.start();
    }
}

方法五

使用lambda表達(dá)式

/**
 * 使用lambda表達(dá)式
 */
public class ThreadDemo5 {
    public static void main(String[] args) {
        //創(chuàng)建線(xiàn)程
        Thread thread = new Thread(()->{
            //業(yè)務(wù)代碼
            Thread thread3 = Thread.currentThread();
            System.out.println("名稱(chēng)" + thread3.getName());
        });
        //啟動(dòng)線(xiàn)程
        thread.start();
    }
}

方法六

帶返回值的 Callable

import java.util.Random;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

/**
 * 使用callable創(chuàng)建線(xiàn)程
 */
public class ThreadDemo6 {
    public static void main(String[] args)throws ExecutionException, InterruptedException {
        // 創(chuàng)建 Callable 實(shí)例
        MyCallable callable = new MyCallable();
        // 用于接收 Callable 結(jié)果的對(duì)象
        FutureTask<Integer> futureTask = new FutureTask<Integer>(callable);
        // 創(chuàng)建新線(xiàn)程
        Thread thread = new Thread(futureTask);
        // 啟動(dòng)線(xiàn)程
        thread.start();
        // 接收新線(xiàn)程執(zhí)行的結(jié)果
        int result = futureTask.get();
        System.out.println(Thread.currentThread().getName() +
                "——新線(xiàn)程返回的結(jié)果為:" + result);
    }
}
/**
 * Callable<V> 泛型里面可以是任意數(shù)據(jù)類(lèi)型
 */
class MyCallable implements Callable<Integer> {
    @Override
    public Integer call() throws Exception {
        // 生成隨機(jī)數(shù):0-9
        int randomNum = new Random().nextInt(10);
        System.out.println(Thread.currentThread().getName() +
                "——隨機(jī)數(shù):" + randomNum);
        return randomNum;
    }
}

在創(chuàng)建線(xiàn)程時(shí), 如果是 JDK 1.8 以上版本,在不需要獲得線(xiàn)程執(zhí)行結(jié)果的情況下,推薦使用Lambda 方式來(lái)創(chuàng)建線(xiàn)程,因?yàn)樗膶?xiě)法足夠簡(jiǎn)潔;如果想要獲取線(xiàn)程執(zhí)行結(jié)果,可使用FutureTask + Callable 的方式來(lái)實(shí)現(xiàn)

二、run方法和start方法的區(qū)別

run 方法和 start 方法的主要區(qū)別如下:

①方法性質(zhì)不同

run 是一個(gè)普通方法,而 start 是開(kāi)啟新線(xiàn)程的方法。

②執(zhí)行速度不同

調(diào)用 run 方法會(huì)立即執(zhí)行任務(wù),調(diào)用 start 方法是將線(xiàn)程的狀態(tài)改為就緒狀態(tài),不會(huì)立即執(zhí)行。

③調(diào)用次數(shù)不同

run 方法可以被重復(fù)調(diào)用,而 start 方法只能被調(diào)用一次。start 方法之所以不能被重復(fù)調(diào)用的原因是,線(xiàn)程的狀態(tài)是不可逆的,Thread 在 start 的實(shí)現(xiàn)源碼中做了判斷,如果線(xiàn)程不是新建狀態(tài) NEW,則會(huì)拋出非法線(xiàn)程狀態(tài)異常IllegalThreadStateException

  public static void main(String[] args) {
        // 創(chuàng)建線(xiàn)程一
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                // 獲取到當(dāng)前執(zhí)行的線(xiàn)程
                Thread currThread = Thread.currentThread();
                System.out.println("執(zhí)行線(xiàn)程一,線(xiàn)程名:" + currThread.getName());
            }
        });
        // 調(diào)用 run 方法
        thread.run();
        // 多次調(diào)用 run 方法
        thread.run();

        // 創(chuàng)建線(xiàn)程二
        Thread thread2 = new Thread(new Runnable() {
            @Override
            public void run() {
                // 獲取到當(dāng)前執(zhí)行的線(xiàn)程
                Thread currThread = Thread.currentThread();
                System.out.println("執(zhí)行線(xiàn)程二,線(xiàn)程名:" + currThread.getName());
            }
        });
       // 調(diào)用 start 方法
        thread2.start();
       // 多次調(diào)用 start 方法
        thread2.start();
    }

從上述結(jié)果可以看出,run 方法多次調(diào)用可用正常執(zhí)行,而第二次調(diào)用 start 方法時(shí)程序就報(bào)錯(cuò)了,提示“IllegalThreadStateException”非法線(xiàn)程狀態(tài)異常

總結(jié)

方法性質(zhì)不同:run 是一個(gè)普通方法,而 start 是開(kāi)啟新線(xiàn)程的方法。

執(zhí)行速度不同:調(diào)用 run 方法會(huì)立即執(zhí)行任務(wù),調(diào)用 start 方法是將線(xiàn)程的狀態(tài)改為就緒狀態(tài),不會(huì)立即執(zhí)行。

調(diào)用次數(shù)不同:run 方法可以被重復(fù)調(diào)用,而 start 方法只能被調(diào)用一次。

三、線(xiàn)程的構(gòu)造方法

1、Thread()創(chuàng)建線(xiàn)程

Thread t1 = new Thread();

2、Thread(Runnable target) 創(chuàng)建線(xiàn)程

Thread t2 = new Thread(new MyRunnable());

3、Thread(String name)創(chuàng)建線(xiàn)程且命名

/**
 * 創(chuàng)建線(xiàn)程,構(gòu)造方法設(shè)置線(xiàn)程名稱(chēng)
 */
public class ThreadDemo9 {
    public static void main(String[] args) {
        //構(gòu)造方法設(shè)置名稱(chēng)
        Thread thread = new Thread("線(xiàn)程1"){
            @Override
            public void run() {
                //休眠線(xiàn)程
                try {
                    Thread.sleep(1000*60*60);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        };
        thread.start();
    }
}

4、Thread(Runnable target, String name),用Runnable 對(duì)象創(chuàng)建線(xiàn)程對(duì)象,并命名

/**
 * 創(chuàng)建線(xiàn)程,并設(shè)置名稱(chēng)
 */
public class ThreadDemo10 {
    public static void main(String[] args) {
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    Thread.sleep(1000*60*60);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        },"Runable-Thread");
        thread.start();
    }
}

到此這篇關(guān)于深入探究Java線(xiàn)程的創(chuàng)建與構(gòu)造方法的文章就介紹到這了,更多相關(guān)Java線(xiàn)程內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

  • Java算法設(shè)計(jì)與分析分治算法

    Java算法設(shè)計(jì)與分析分治算法

    這篇文章主要介紹了Java算法設(shè)計(jì)與分析分治算法,一般分治算法在正文中分解為兩個(gè)即以上的遞歸調(diào)用,并且子類(lèi)問(wèn)題一般是不想交的
    2022-07-07
  • java寫(xiě)卷積神經(jīng)網(wǎng)絡(luò)(CupCnn簡(jiǎn)介)

    java寫(xiě)卷積神經(jīng)網(wǎng)絡(luò)(CupCnn簡(jiǎn)介)

    這篇文章主要介紹了java寫(xiě)卷積神經(jīng)網(wǎng)絡(luò)(CupCnn簡(jiǎn)介),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-04-04
  • Java?Stream去重常見(jiàn)的多種方法及示例

    Java?Stream去重常見(jiàn)的多種方法及示例

    這篇文章主要介紹了Java?Stream中實(shí)現(xiàn)去重的多種方法,包括使用distinct()、Collectors.toMap、filter和groupingBy等,詳細(xì)說(shuō)明了每種方法的應(yīng)用場(chǎng)景和示例代碼,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-04-04
  • 使用Jmeter進(jìn)行http接口測(cè)試的詳細(xì)流程

    使用Jmeter進(jìn)行http接口測(cè)試的詳細(xì)流程

    本文主要針對(duì)http接口進(jìn)行測(cè)試,使用Jmeter工具實(shí)現(xiàn),  Jmter工具設(shè)計(jì)之初是用于做性能測(cè)試的,它在實(shí)現(xiàn)對(duì)各種接口的調(diào)用方面已經(jīng)做的比較成熟,因此,本次直接使用Jmeter工具來(lái)完成對(duì)Http接口的測(cè)試,需要的朋友可以參考下
    2024-12-12
  • Java使用Armitage進(jìn)行滲透測(cè)試的方法

    Java使用Armitage進(jìn)行滲透測(cè)試的方法

    在網(wǎng)絡(luò)安全領(lǐng)域,滲透測(cè)試是一種重要的安全評(píng)估手段,它通過(guò)模擬惡意黑客的行為來(lái)檢測(cè)目標(biāo)系統(tǒng)是否存在安全漏洞,Armitage是一個(gè)基于Java的圖形化滲透測(cè)試工具,本文將介紹如何使用Armitage進(jìn)行滲透測(cè)試,需要的朋友可以參考下
    2024-12-12
  • java使用動(dòng)態(tài)代理來(lái)實(shí)現(xiàn)AOP(日志記錄)的實(shí)例代碼

    java使用動(dòng)態(tài)代理來(lái)實(shí)現(xiàn)AOP(日志記錄)的實(shí)例代碼

    AOP(面向方面)的思想,就是把項(xiàng)目共同的那部分功能分離開(kāi)來(lái),比如日志記錄,避免在業(yè)務(wù)邏輯里面夾雜著跟業(yè)務(wù)邏輯無(wú)關(guān)的代碼
    2013-09-09
  • RestTemplate使用不當(dāng)引發(fā)的問(wèn)題及解決

    RestTemplate使用不當(dāng)引發(fā)的問(wèn)題及解決

    這篇文章主要介紹了RestTemplate使用不當(dāng)引發(fā)的問(wèn)題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • spring三級(jí)緩存以及為什么不用二級(jí)緩存解讀

    spring三級(jí)緩存以及為什么不用二級(jí)緩存解讀

    Spring三級(jí)緩存機(jī)制解決了循環(huán)依賴(lài)問(wèn)題,通過(guò)一級(jí)緩存存放完全初始化的bean,二級(jí)緩存存放實(shí)例化但未完成依賴(lài)注入和初始化的bean,三級(jí)緩存存放bean的創(chuàng)建工廠(chǎng),避免了重復(fù)創(chuàng)建和確保代理對(duì)象的正確生成
    2025-02-02
  • 最新評(píng)論

    大埔区| 高台县| 四平市| 巴塘县| 华坪县| 许昌市| 囊谦县| 中卫市| 宜兰市| 稷山县| 泸州市| 峡江县| 额尔古纳市| 松潘县| 淄博市| 青浦区| 河西区| 论坛| 姚安县| 焦作市| 洪洞县| 鹤庆县| 奉化市| 四平市| 澄江县| 灵石县| 郓城县| 辽宁省| 年辖:市辖区| 玛纳斯县| 洛川县| 新蔡县| 纳雍县| 桦甸市| 大埔县| 南通市| 南漳县| 万源市| 库车县| 洞口县| 湄潭县|