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

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

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

一、創(chuàng)建線程

啟動線程—start 方法

通過覆寫 run 方法創(chuàng)建?個線程對象,但線程對象被創(chuàng)建出來并不意味著線程就開始運(yùn)行了

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

方法一

繼承Thread類

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

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

方法二

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

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

方法三

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

/**
 * 繼承Thread使用匿名內(nè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("名稱" + thread2.getName());
            }
        };
        //開始線程
        thread.start();

    }
}

方法四

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

/**
 * runnable使用匿名內(nè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("名稱:" + thread1.getName());
            }
        });
        //開啟線程
        thread.start();
    }
}

方法五

使用lambda表達(dá)式

/**
 * 使用lambda表達(dá)式
 */
public class ThreadDemo5 {
    public static void main(String[] args) {
        //創(chuàng)建線程
        Thread thread = new Thread(()->{
            //業(yè)務(wù)代碼
            Thread thread3 = Thread.currentThread();
            System.out.println("名稱" + thread3.getName());
        });
        //啟動線程
        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)建線程
 */
public class ThreadDemo6 {
    public static void main(String[] args)throws ExecutionException, InterruptedException {
        // 創(chuàng)建 Callable 實(shí)例
        MyCallable callable = new MyCallable();
        // 用于接收 Callable 結(jié)果的對象
        FutureTask<Integer> futureTask = new FutureTask<Integer>(callable);
        // 創(chuàng)建新線程
        Thread thread = new Thread(futureTask);
        // 啟動線程
        thread.start();
        // 接收新線程執(zhí)行的結(jié)果
        int result = futureTask.get();
        System.out.println(Thread.currentThread().getName() +
                "——新線程返回的結(jié)果為:" + result);
    }
}
/**
 * Callable<V> 泛型里面可以是任意數(shù)據(jù)類型
 */
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)建線程時(shí), 如果是 JDK 1.8 以上版本,在不需要獲得線程執(zhí)行結(jié)果的情況下,推薦使用Lambda 方式來創(chuàng)建線程,因?yàn)樗膶懛ㄗ銐蚝啙崳蝗绻胍@取線程執(zhí)行結(jié)果,可使用FutureTask + Callable 的方式來實(shí)現(xiàn)

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

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

①方法性質(zhì)不同

run 是一個普通方法,而 start 是開啟新線程的方法。

②執(zhí)行速度不同

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

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

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

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

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

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

總結(jié)

方法性質(zhì)不同:run 是一個普通方法,而 start 是開啟新線程的方法。

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

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

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

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

Thread t1 = new Thread();

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

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

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

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

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

/**
 * 創(chuàng)建線程,并設(shè)置名稱
 */
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線程的創(chuàng)建與構(gòu)造方法的文章就介紹到這了,更多相關(guān)Java線程內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳解如何在Java中實(shí)現(xiàn)堆排序算法

    詳解如何在Java中實(shí)現(xiàn)堆排序算法

    這篇文章主要為大家詳細(xì)介紹了如何利用Java實(shí)現(xiàn)堆排序算法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • Java的RocketMQ之消息存儲和查詢原理詳解

    Java的RocketMQ之消息存儲和查詢原理詳解

    這篇文章主要介紹了Java的RocketMQ之消息存儲和查詢原理詳解,一臺Broker服務(wù)器只有一個CommitLog文件(組),RocketMQ會將所有主題的消息存儲在同一個文件中,這個文件中就存儲著一條條Message,每條Message都會按照順序?qū)懭?需要的朋友可以參考下
    2024-01-01
  • Java算法設(shè)計(jì)與分析分治算法

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

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

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

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

    Java?Stream去重常見的多種方法及示例

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

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

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

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

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

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

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

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

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

    spring三級緩存以及為什么不用二級緩存解讀

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

最新評論

凉城县| 白山市| 石河子市| 昂仁县| 长宁区| 邹平县| 黎平县| 江华| 商都县| 香港 | 武平县| 哈密市| 九寨沟县| 大邑县| 汉川市| 绥化市| 元氏县| 多伦县| 富源县| 万安县| 鹤岗市| 平南县| 曲沃县| 老河口市| 深水埗区| 政和县| 阜城县| 永定县| 项城市| 永城市| 石渠县| 彩票| 清河县| 朝阳县| 永兴县| 竹山县| 文山县| 镇康县| 宁陵县| 桐庐县| 汝阳县|