码迷,mamicode.com
首页 > 其他好文 > 详细

Thread类解析

时间:2020-06-16 23:18:01      阅读:65      评论:0      收藏:0      [点我收藏+]

标签:native   als   lse   阻塞   启动   一个   nts   重要   进入   

Thread线程类API

声明本文使用的是JDK1.8

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

1.1设置线程名

 

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

 

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

线程中nextThreadNum()方法实现为我们线程命名,如果我们想要为线程起个名字,那也是很简单的。Thread给我们提供了构造方法!

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, "harpoonJava");
        Thread thread2 = new Thread(myThread, "harpoon");
        thread1.start();
        thread2.start();
		
		// 打印当前线程的名字
        System.out.println(Thread.currentThread().getName());
    }
} 

结果:

main
harpoonJava
harpoon

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

 

1.2守护线程

 

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

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

守护线程有一个特点:

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

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

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

 

1.3优先级线程

 

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

 

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

 

Java提供的优先级默认是5,最低是1,最高是10。

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

private native void setPriority0(int newPriority);

 

1.4线程生命周期

 

在上一篇介绍的时候其实也提过了线程的线程有3个基本状态:执行、就绪、阻塞

 

Thread上很多的方法都是用来切换线程的状态的,这一部分是重点!

 

1.4.1sleep方法

 

调用sleep方法会进入计时等待状态,等时间到了,进入的是就绪状态而并非是运行状态!

1.4.2yield方法

 

调用yield方法会先让别的线程执行,但是不确保真正让出

 

  • 意思是:我有空,可以的话,让你们先执行

 

1.4.3join方法

 

调用join方法,会等待该线程执行完毕后才执行别的线程~

 

1.4.3interrupt方法

 

线程中断在之前的版本有stop方法,但是被设置过时了。现在已经没有强制线程终止的方法了!

 

由于stop方法可以让一个线程A终止掉另一个线程B

  • 被终止的线程B会立即释放锁,这可能会让对象处于不一致的状态。
  • 线程A也不知道线程B什么时候能够被终止掉,万一线程B还处理运行计算阶段,线程A调用stop方法将线程B终止,那就很无辜了~总而言之,Stop方法太暴力了,不安全,所以被设置过时了。我们一般使用的是interrupt来请求终止线程~
  • 要注意的是:interrupt不会真正停止一个线程,它仅仅是给这个线程发了一个信号告诉它,它应该要结束了(明白这一点非常重要!)
  • 也就是说:Java设计者实际上是想线程自己来终止,通过上面的信号,就可以判断处理什么业务了。
  • 具体到底中断还是继续运行,应该由被通知的线程自己处理

再次说明:调用interrupt()并不是要真正终止掉当前线程,仅仅是设置了一个中断标志。这个中断标志可以给我们用来判断什么时候该干什么活!什么时候中断由我们自己来决定,这样就可以安全地终止线程了!

interrupt方法压根是不会对线程的状态造成影响的,它仅仅设置一个标志位罢了

interrupt线程中断还有另外两个方法(检查该线程是否被中断):

  • 静态方法interrupted()-->会清除中断标志位
  • 实例方法isInterrupted()-->不会清除中断标志位

如果阻塞线程调用了interrupt()方法,那么会抛出异常,设置标志位为false,同时该线程会退出阻塞的。

 

 

 

Thread类解析

标签:native   als   lse   阻塞   启动   一个   nts   重要   进入   

原文地址:https://www.cnblogs.com/harpoonJava/p/13149701.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!