如何创建线程?守护线程?阻塞线程?同步线程?

这篇文章主要是对线程有基本了解的伙伴当作笔记来瞅一眼。关于什么是线程等问题不会进行描述。

目录

*
一、创建线程
二、阻塞线程
三、守护线程
四、同步线程

一、创建线程

创建线程的方式主要有俩种,说是俩种,我们点进源码去看一下,其实就是一种方式,因为 Thread类就是 实现Runnable接口。换汤不换药。

第一种:通过继承Thread类重写run方法:

public class CreateThread {
    public static void main(String[] args) {
        Thread t1 = new MyThread();
        //启动线程
        t1.start();
    }
}

class MyThread extends Thread{
    @Override
    public void run() {
        System.out.println("创建线程!");
    }
}

简写方式:

//匿名内部类
new Thread(){
            @Override
            public void run() {
                System.out.println("创建线程!");
            }
        }.start();

第二种:通过实现Runnable接口重写run方法:

public class createThread {
    public static void main(String[] args) {
        //实例化任务
        Runnable r1 = new MyRunnable();
        //创建线程同时指定任务
        Thread t1 = new Thread(r1);
        //等于Thread t1 = new Thread(new MyRunnable)
        t1.start();
    }
}

class MyRunnable implements Runnable{
    @Override
    public void run() {
        System.out.println("创建线程!");
    }
}

简写方式:

new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("创建线程!");
            }
        }).start();

最简方式 Lambda表达式:

new Thread(()-> System.out.println("创建线程!")).start();

二、阻塞线程

Thread类提供静态方法sleep(),让运行这个方法的线程阻塞指定毫秒。
注:这里需要捕捉阻塞中断异常!怎么理解呢,就是在睡觉时醒来不是自然醒,被外力弄醒。

new Thread(()-> {
            try {
                //线程阻塞2秒
                Thread.sleep(2000);
                //2秒之后执行打印
                System.out.println("我自由了!");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }).start();

有睡眠方法,肯定要有叫醒方法呀,也就是中断线程阻塞。通过线程实例调用 interrupt 方法(会触发异常),我这里图方便写的匿名类,无法调用就不调用了。算了,贴一下代码瞅一眼吧。

Thread t1 = new Thread(()->{
            try {
                Thread.sleep(5000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });
        t1.start();

        new Thread(()->{
            System.out.println("我要打断t1线程睡眠!");
            t1.interrupt();
        }).start();

运行结果:
    我要打断t1线程睡眠!
    java.lang.InterruptedException: sleep interrupted

三、守护线程

什么是守护程序线程?[en]What is a daemon thread?
守护线程又称为后台线程,在默认情况下我们创建的线程都为普通线程。在线程启动 之前调用 setDaemon(true)方法才会将普通线程变为守护线程。
那么,守护程序线程和普通线程有什么不同呢?[en]So what’s the difference between a daemon thread and an ordinary thread?
以我们的兵哥为例:我们老百姓属于平凡的线,兵哥就是我们的守护线。无论发生什么危险和意外,永远是军人兄弟们守护着我们,把我们抛在身后。当我们的普通人全部离开后,士兵们将有秩序地撤离。应该理解这一点:在所有正常线程完成后,将强制停止所有正在运行的守护进程线程。这一过程将会结束。[en]Take our soldier brother as an example: we ordinary people belong to the ordinary thread, and the soldier brother is our guardian thread. No matter what danger or accident happens, it will always be the soldier brothers who will guard us and leave behind us. After all our ordinary people leave, the soldiers will evacuate in an orderly manner. This should be understood: * all running daemon threads will be forced to stop after all normal threads are finished. The process will be over. *

Thread t1 = new Thread(()->{
            while(true){
                System.out.println("我是守护线程!");
            }
        });
        //在线程调用之前设置为守护线程
        t1.setDaemon(true);
        t1.start();

        new Thread(()->{
            for (int i = 0; i < 100; i++) {
                System.out.println("&#x6211;&#x662F;&#x666E;&#x901A;&#x7EBF;&#x7A0B;&#xFF01;");
            }
        }).start();

&#x8FD0;&#x884C;&#x7ED3;&#x679C;&#xFF1A;
    &#x6211;&#x4EEC;&#x5728;t1&#x7EBF;&#x7A0B;&#x4E2D;&#x5199;&#x7684;&#x662F;&#x4E00;&#x4E2A;&#x6B7B;&#x5FAA;&#x73AF;&#xFF0C;&#x8FD0;&#x884C;&#x4E4B;&#x540E;&#x4F1A;&#x53D1;&#x73B0;&#x666E;&#x901A;&#x7EBF;&#x7A0B;&#x7ED3;&#x675F;&#x540E;
    &#x6211;&#x4EEC;&#x7684;t1&#x6B7B;&#x5FAA;&#x73AF;&#x7EBF;&#x7A0B;&#x4E5F;&#x7ED3;&#x675F;&#x4E86;&#xFF01;

四、同步线程

我们应该知道,线程属于并发编程,每一个线程都是在埋头各干各的任务。如果我们有一个需求需要线程同步应该如何做?Thread类中提供 join()方法(需要捕捉中断异常)来协调多个线程同步。点开该方法看一下源码注释: Waits for this thread to die.意思很明显了—>等待该线程死亡。
当然Thread类也重载了该join方法,可自行点开源码查看。如 join(long millis)等待调用join方法的线程多少毫秒。

如何创建线程?守护线程?阻塞线程?同步线程?

让我举一个我在课堂上学到的例子:[en]Let me take an example that I learned in my class:
当我们打开网页时,我们需要同时加载文本和图片。文本加载完成后,我们需要等待图片加载,然后才能显示文本和图片。[en]When we open a web page, we need to load the text and the picture at the same time. After the text loading is finished, we need to wait for the picture to be loaded before the text and picture can be displayed.

Thread t1 = new Thread(()->{
            System.out.println("&#x5F00;&#x59CB;&#x52A0;&#x8F7D;&#x56FE;&#x7247;&#xFF01;");

            try {
                Thread.sleep(5000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            System.out.println("&#x56FE;&#x7247;&#x52A0;&#x8F7D;&#x5B8C;&#x6210;&#xFF01;");
        });

        t1.start();

        new Thread(()->{
            System.out.println("&#x5F00;&#x59CB;&#x52A0;&#x8F7D;&#x6587;&#x5B57;&#xFF01;");
            System.out.println("&#x6587;&#x5B57;&#x52A0;&#x8F7D;&#x5B8C;&#x6210;&#xFF01;");

            try {
                t1.join();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            System.out.println("&#x5168;&#x90E8;&#x52A0;&#x8F7D;&#x6210;&#x529F;&#xFF0C;&#x5F00;&#x59CB;&#x663E;&#x793A;&#x7F51;&#x9875;!");

        }).start();

运行结果:[en]Running result:

如何创建线程?守护线程?阻塞线程?同步线程?

&#x6CE8; :在使用线程的时候一定需要注意线程安全的问题!

Original: https://blog.csdn.net/weixin_45056780/article/details/105767397
Author: 世代农民
Title: 如何创建线程?守护线程?阻塞线程?同步线程?

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/6107/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

发表回复

登录后才能评论
免费咨询
免费咨询
扫码关注
扫码关注
联系站长

站长Johngo!

大数据和算法重度研究者!

持续产出大数据、算法、LeetCode干货,以及业界好资源!

2022012703491714

微信来撩,免费咨询:xiaozhu_tec

分享本页
返回顶部