欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解Java線程的創(chuàng)建及休眠

 更新時(shí)間:2021年06月11日 08:43:21   作者:MercuryG  
今天帶大家學(xué)習(xí)的是Java的相關(guān)知識(shí),文章圍繞著Java線程的創(chuàng)建及休眠展開,文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下

一、進(jìn)程vs線程

  • 1、進(jìn)程是系統(tǒng)分配資源的最小單位;線程是系統(tǒng)調(diào)度的最小單位
  • 2、一個(gè)進(jìn)程中至少要包含一個(gè)線程
  • 3、線程必須要依附于繼承,線程是進(jìn)程實(shí)質(zhì)工作的一個(gè)最小單位

二、線程的創(chuàng)建方式

繼承Thread類 實(shí)現(xiàn)線程的創(chuàng)建(2種寫法)

1種寫法

public class ThreadDemo03 {

    static  class MyThread extends Thread{
        @Override
        public void run(){
            System.out.println("線程名稱:" +
                    Thread.currentThread().getName());
        }
    }

    public static void main(String[] args) {
        // 創(chuàng)建了線程
        Thread t1 = new MyThread();
        // 啟動(dòng)線程
        t1.start();
        System.out.println("當(dāng)前線程的名稱(主線程):" +
                Thread.currentThread().getName());
    }
}

2種寫法

public class ThreadDemo04 {
    public static void main(String[] args) {
        
        Thread thread = new Thread(){
            @Override
            public void run() {
                System.out.println("線程名:" +
                        Thread.currentThread().getName());
            }
        };
        thread.start();
        
    }
}

繼承Thread類的創(chuàng)建方式的缺點(diǎn):在Java語言設(shè)計(jì)當(dāng)中只能實(shí)現(xiàn)單繼承,如果繼承了Thread類,就不能繼承其他類了,所以這種創(chuàng)建方式在開發(fā)中使用。

三、實(shí)現(xiàn)Runnable接口的方式(3種)

在Java中不能實(shí)現(xiàn)多繼承,但是可以實(shí)現(xiàn)多接口

1種方法

public class ThreadDemo05 {
    static class MyRunnable implements Runnable{
        @Override
        public void run() {
            System.out.println("線程名:" +
                    Thread.currentThread().getName());
        }
    }

    public static void main(String[] args) {
        // 1、新建Runnable類
        MyRunnable runnable = new MyRunnable();

        // 2、新建Thread
        Thread thread = new Thread(runnable);

        // 3、啟動(dòng)線程
        thread.start();
    }
}

2種方法

public class ThreadDemo06 {
    public static void main(String[] args) {

        // 匿名內(nèi)部類的方式實(shí)現(xiàn)線程

        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("線程名:" +
                        Thread.currentThread().getName());
            }
        });
        thread.start();
    }
}

3種方法

/**
 * 使用拉姆達(dá)表達(dá)式的方式創(chuàng)建
 * **/
public class ThreadDemo07 {
    public static void main(String[] args) {
        Thread thread  = new Thread(() -> {
            System.out.println("線程名: "+ 
                    Thread.currentThread().getName());
        });
        thread.start();
    }
}

四、實(shí)現(xiàn)Callable接口的方式(1種)

為了拿到執(zhí)行完線程后可以得到返回值的方法

package Thread;

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

/**
 * 創(chuàng)建并得到線程執(zhí)行的結(jié)果
 * 實(shí)現(xiàn)Callable 接口  + Future容器 的方式
 * */


public class ThreadDemo08 {

    static class MyCallable implements Callable<Integer >{ // 想要返回的是Integer類型

        @Override
        public Integer call() throws Exception {

            // 生成一個(gè)隨機(jī)數(shù)
            int num = new Random().nextInt(10);
            System.out.println("子線程:" +
                    Thread.currentThread().getName() +
                    "隨機(jī)數(shù):" + num);
            return num;
        }
    }

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        // 1、創(chuàng)建一個(gè)Callable
        MyCallable myCallable = new MyCallable();

        // 2、創(chuàng)建一個(gè)FutureTask 對(duì)象來接受返回值
        FutureTask<Integer> futureTask =
                new FutureTask<>(myCallable);
        // 3、創(chuàng)建Thread
        Thread thread = new Thread(futureTask);

        // 啟動(dòng)線程
        thread.start();

        // 得到線程執(zhí)行結(jié)果
        int result = futureTask.get();
        System.out.println(String.format("線程名:%s,數(shù)字:%d",
                Thread.currentThread().getName(), result));
    }
}

五、線程的休眠

  • 1、Thread.sleep()
  • 2、TimeUnit.SECONDS.sleep(1)休眠一秒鐘
  • 其中可選的有DAYS表示天,HOURS表示小時(shí)
  • 3、Thread.sleep(TimeUnit.SECONDS.toMillis(1))

練習(xí):使用連個(gè)線程來打印“AABBCCDD”,一個(gè)線程只能打印"ABCD"

package Thread;

public class ThreadDemo09 {
    public static void main(String[] args) {
        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                String data = "ABCD";
                for (char item:data.toCharArray()) {
                    System.out.print(item);
                    try {
                        // 休眠一段時(shí)間
                        Thread.sleep(1);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        };

        Thread t1 = new Thread(runnable);
        Thread t2 = new Thread(runnable);
        t1.start();
        t2.start();
    }

}

六、線程優(yōu)先級(jí)

默認(rèn)優(yōu)先級(jí)為5

最小優(yōu)先級(jí)為1

最大優(yōu)先級(jí)為10

優(yōu)先級(jí)越大那么它的執(zhí)行權(quán)重越高

理論上優(yōu)先級(jí)越高,執(zhí)行權(quán)限也就越大,但是CPU的調(diào)度實(shí)很復(fù)雜的,所以不會(huì)嚴(yán)格按照優(yōu)先級(jí)的排序去執(zhí)行,但總體還是優(yōu)先級(jí)越高,執(zhí)行權(quán)重越高

七、守護(hù)線程

守護(hù)線程使用場景:Java垃圾回收器、TCP的健康檢測

守護(hù)線程需要注意的事項(xiàng):

  •  1、守護(hù)線程必須設(shè)置在Thread.start()之前,如果設(shè)置守護(hù)線程再開始線程之后,那么程序就會(huì)報(bào)錯(cuò),并且設(shè)置的守護(hù)線程值不能生效
  • 2、在守護(hù)線程t1內(nèi)部創(chuàng)建一個(gè)新的線程t2,此時(shí)t2默認(rèn)情況下也是守護(hù)線程

到此這篇關(guān)于詳解Java線程的創(chuàng)建及休眠的文章就介紹到這了,更多相關(guān)Java線程內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • spring中aop的xml配置方法實(shí)例詳解

    spring中aop的xml配置方法實(shí)例詳解

    AOP的配置方式有2種方式:xml配置和AspectJ注解方式。下面這篇文章主要給大家介紹了關(guān)于spring中aop的xml配置方法的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-07-07
  • 基于Rest的API解決方案(jersey與swagger集成)

    基于Rest的API解決方案(jersey與swagger集成)

    下面小編就為大家?guī)硪黄赗est的API解決方案(jersey與swagger集成)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-08-08
  • 簡單了解Java的默認(rèn)和靜態(tài)方法

    簡單了解Java的默認(rèn)和靜態(tài)方法

    這篇文章主要介紹了簡單了解Java的默認(rèn)和靜態(tài)方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-01-01
  • java并發(fā)高的情況下用ThreadLocalRandom來生成隨機(jī)數(shù)

    java并發(fā)高的情況下用ThreadLocalRandom來生成隨機(jī)數(shù)

    如果我們想要生成一個(gè)隨機(jī)數(shù),通常會(huì)使用Random類。但是在并發(fā)情況下Random生成隨機(jī)數(shù)的性能并不是很理想,本文主要介紹了java并發(fā)高的情況下用ThreadLocalRandom來生成隨機(jī)數(shù),感興趣的可以了解一下
    2022-05-05
  • Java SpringBoot安全框架整合Spring Security詳解

    Java SpringBoot安全框架整合Spring Security詳解

    這篇文章主要介紹了Spring Boot整合Spring Security的示例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2021-09-09
  • SpringBoot如何優(yōu)雅的實(shí)現(xiàn)重試功能

    SpringBoot如何優(yōu)雅的實(shí)現(xiàn)重試功能

    這篇文章主要詳細(xì)介紹了SpringBoot如何優(yōu)雅的實(shí)現(xiàn)重試功能的步驟詳解,文中有詳細(xì)的代碼示例,具有一定的參考價(jià)值,感興趣的同學(xué)可以借鑒閱讀
    2023-06-06
  • Fluent Mybatis 批量更新的使用

    Fluent Mybatis 批量更新的使用

    本文主要介紹了Fluent Mybatis 批量更新的使用,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • Git設(shè)置和取消代理的方法

    Git設(shè)置和取消代理的方法

    今天小編就為大家分享一篇關(guān)于Git設(shè)置和取消代理的方法,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • Mybatis是這樣防止sql注入的

    Mybatis是這樣防止sql注入的

    本文詳細(xì)講解了Mybatis是如何防止sql注入的,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值。需要的朋友可以收藏下,方便下次瀏覽觀看
    2021-12-12
  • k8s解決java服務(wù)下載超時(shí)問題小結(jié)

    k8s解決java服務(wù)下載超時(shí)問題小結(jié)

    我們?cè)谧遡ngress的java程序的時(shí)候,往往會(huì)有導(dǎo)出數(shù)據(jù)的功能,這個(gè)時(shí)候就會(huì)有因網(wǎng)絡(luò)慢、后臺(tái)處理時(shí)間過長導(dǎo)致下載超時(shí),也有因下載文件太大,導(dǎo)致下載失敗,下面給分享k8s解決java服務(wù)下載超時(shí)問題,感興趣的朋友跟隨小編一起看看吧
    2024-06-06

最新評(píng)論