深入了解线程

线程的常用方法

Thread.currentThead():获取当前线程对象

getPriority():获取当前线程的优先级

setPriority():设置当前线程的优先级

注意:线程优先级高,被CPU调度的概率大,但不代表一定会运行,还有小概率运行优先级低的线程。

isAlive():判断线程是否处于活动状态 (线程调用start后,即处于活动状态)

join():调用join方法的线程强制执行,其他线程处于阻塞状态,等该线程执行完后,其他线程再执行。有可能被外界中断产生InterruptedException 中断异常。

sleep():在指定的毫秒数内让当前正在执行的线程休眠(暂停执行)。休眠的线程进入阻塞状态。

yield():调用yield方法的线程,会礼让其他线程先运行。(大概率其他线程先运行,小概率自己还会运行,礼让平级线程)

interrupt():中断线程

wait():导致线程等待,进入阻塞状态。该方法要在同步方法或者同步代码块中才使用的

notify():唤醒当前线程,进入运行状态。该方法要在同步方法或者同步代码块中才使用的

notifyAll():唤醒所有等待的线程。该方法要在同步方法或者同步代码块中才使用的

线程的状态



新建状态:

使用 new 关键字和 Thread 类或其子类建立一个线程对象后,该线程对象就处于新建状态。它保持这个状态直到程序 start() 这个线程。

就绪状态:

当线程对象调用了start()方法之后,该线程就进入就绪状态。就绪状态的线程处于就绪队列中,要等待JVM里线程调度器的调度。

运行状态:

如果就绪状态的线程获取 CPU 资源,就可以执行 run(),此时线程便处于运行状态。处于运行状态的线程最为复杂,它可以变为阻塞状态、就绪状态和死亡状态。

阻塞状态:

如果一个线程执行了sleep(睡眠)、suspend(挂起)等方法,失去所占用资源之后,该线程就从运行状态进入阻塞状态。在睡眠时间已到或获得设备资源后可以重新进入就绪状态。可以分为三种:

等待阻塞:运行状态中的线程执行 wait() 方法,使线程进入到等待阻塞状态。

同步阻塞:线程在获取 synchronized同步锁失败(因为同步锁被其他线程占用)。

其他阻塞:通过调用线程的 sleep() 或 join() 发出了 I/O请求时,线程就会进入到阻塞状态。当sleep() 状态超时,join() 等待线程终止或超时,或者 I/O 处理完毕,线程重新转入就绪状态。

死亡状态:

一个运行状态的线程完成任务或者其他终止条件发生时,该线程就切换到死亡状态。

线程的优先级

在操作系统中,线程会划分出优先级,优先级越高的线程抢占cpu资源的可能性越高

Java使用getPriority()和setPriority()查看和设置线程的优先级。Java中线程优先级范围为1-10,线程默认优先级为5.

在Java中优先级具有继承性,比如B线程启动A线程,则A线程的优先级与B线程相同。

Daemon守护线程

在Java中有两类线程 User 用户Daemon守护线程

守护线程可以理解为User线程提供服务的保姆,只要有用户线程正在运行,Java所有守护线程都会提供服务。守护线程最典型的就是GC(垃圾回收器)。

用户在编写程序时也可以自己设置守护线程,代码如下

Thread daemonTread = new Thread();  

// 设定 daemonThread 为 守护线程,default false(非守护线程)  

daemonThread.setDaemon(true);  

// 验证当前线程是否为守护线程,返回 true 则为守护线程  

 daemonThread.isDaemon();  

你可能感兴趣的:(深入了解线程)