Thread源码剖析(一)

简介: 笔记

前言


昨天已经写了:

  • 多线程三分钟就可以入个门了!

如果没看的同学建议先去阅读一遍哦~

在写文章之前通读了一遍《Java 核心技术 卷一》的并发章节和《Java并发编程实战》前面的部分,回顾了一下以前写过的笔记。从今天开始进入多线程的知识点咯~

我其实也是相当于从零开始学多线程的,如果文章有错的地方还请大家多多包含,不吝在评论区下指正呢~~


一、Thread线程类API


声明本文使用的是JDK1.8

实现多线程从本质上都是由Thread类来进行操作的~我们来看看Thread类一些重要的知识点。Thread这个类很大,不可能整个把它看下来,只能看一些常见的、重要的方法

顶部注释的我们已经解析过了,如果不知道的同学可前往:多线程三分钟就可以入个门了!


1.1设置线程名


我们在使用多线程的时候,想要查看线程名是很简单的,调用Thread.currentThread().getName()即可。

如果没有做什么的设置,我们会发现线程的名字是这样子的:主线程叫做main,其他线程是Thread-x

下面我就带着大家来看看它是怎么命名的:

20.png

nextThreadNum()的方法实现是这样的:

21.png

基于这么一个变量-->线程初始化的数量

22.jpg

点进去看到init方法就可以确定了:

23.jpg

看到这里,如果我们想要为线程起个名字,那也是很简单的。Thread给我们提供了构造方法

24.png

下面我们来测试一下:

  • 实现了Runnable的方式来实现多线程:
public class MyThread implements Runnable {
    @Override
    public void run() {
        // 打印出当前线程的名字
        System.out.println(Thread.currentThread().getName());
    }
}

测试:

public class MyThreadDemo {
    public static void main(String[] args) {
        MyThread myThread = new MyThread();
        //带参构造方法给线程起名字
        Thread thread1 = new Thread(myThread, "关注公众号Java3y");
        Thread thread2 = new Thread(myThread, "qq群:742919422");
        thread1.start();
        thread2.start();
        // 打印当前线程的名字
        System.out.println(Thread.currentThread().getName());
    }
}

结果:

25.png

当然了,我们还可以通过setName(String name)的方法来改掉线程的名字的。我们来看看方法实现;

26.png

检查是否有权限修改:

27.jpg

至于threadStatus这个状态属性,貌似没发现他会在哪里修改

28.png


1.2守护线程


守护线程是为其他线程服务的

  • 垃圾回收线程就是守护线程~

守护线程有一个特点

  • 当别的用户线程执行完了,虚拟机就会退出,守护线程也就会被停止掉了。
  • 也就是说:守护线程作为一个服务线程,没有服务对象就没有必要继续运行

使用线程的时候要注意的地方

  1. 在线程启动前设置为守护线程,方法是setDaemon(boolean on)
  2. 使用守护线程不要访问共享资源(数据库、文件等),因为它可能会在任何时候就挂掉了。
  3. 守护线程中产生的新线程也是守护线程

测试一波:

public class MyThreadDemo {
    public static void main(String[] args) {
        MyThread myThread = new MyThread();
        //带参构造方法给线程起名字
        Thread thread1 = new Thread(myThread, "关注公众号Java3y");
        Thread thread2 = new Thread(myThread, "qq群:742919422");
        // 设置为守护线程
        thread2.setDaemon(true);
        thread1.start();
        thread2.start();
        System.out.println(Thread.currentThread().getName());
    }
}

上面的代码运行多次可以出现(电脑性能足够好的同学可能测试不出来):线程1和主线程执行完了,我们的守护线程就不执行了~

29.png

原理:这也就为什么我们要在启动之前设置守护线程了。

30.png


1.3优先级线程


线程优先级高仅仅表示线程获取的CPU时间片的几率高,但这不是一个确定的因素

线程的优先级是高度依赖于操作系统的,Windows和Linux就有所区别(Linux下优先级可能就被忽略了)~

可以看到的是,Java提供的优先级默认是5,最低是1,最高是10:

31.jpg

实现:

32.jpg

setPriority0是一个本地(navite)的方法:

private native void setPriority0(int newPriority);
目录
相关文章
|
6月前
|
监控 安全 算法
Thread入门与线程方法详解及多线程安全
Thread入门与线程方法详解及多线程安全
22 0
|
7月前
|
安全 Java API
Java多线程 --Thread
Java多线程 --Thread
24 0
|
9月前
|
Java 调度
Java多线程(Thread,Runnable,Callable)附带相关面试题
1.通过继承Thread类实现多线程,2.多线程常用操作方法,3.通过Runnable接口实现多线程,4.通过Lambda与Thread结合实现快速创建多线程,5.通过实现Callable接口得到线程返回值
116 0
|
10月前
|
数据采集 资源调度 算法
线程(Thread)的基本概念
线程(Thread)的基本概念
|
12月前
|
Java API C++
高并发编程-Thread#interrupt用法及源码分析
高并发编程-Thread#interrupt用法及源码分析
75 0
|
Java 程序员 Linux
Java多线程-线程的创建(Thread类的基本使用)
Java多线程-线程的创建(Thread类的基本使用)
121 0
Java多线程-线程的创建(Thread类的基本使用)
|
安全 Java API
JAVA多线程Thread
多线程Thread
147 0
JAVA多线程Thread
|
安全 Java 调度
Java并发编程之Thread类详解
Java并发编程之Thread类详解
191 0
Java并发编程之Thread类详解
|
安全 Java 调度
Java多线程——Thread Runnable源码解析
Java多线程的两种实现方法大家都应该知道了:继承Thread的子类实例化和实现Runnable接口用这个接口实现类去创建Thread实例。 Java的线程在Linux平台上使用的是NPTL机制,JVM线程跟内核轻量线程(LWP)一一对应。
1405 0