线程属性整理

1、优先级

Thread的属性priority为优先级字段,在java中优先级从1到10依次提高,默认为5。

有长耗时的操作线程,一般建议设为 优先级,确保cpu资源不会被占用很久;

频繁阻塞(休眠或I/O)的线程设置为 优先级。

操作系统采用时间片(CPU 单次执行某线程的时间)的形式来调度线程的运行,线程被 CPU 调用的时间超过它的时间片后,就会发生线程调度。线程的优先级可以在一定程度上影响它得到时间片的多少,也就是被处理的机会。

2、守护线程

Java 中,线程也分三六九等。守护线程相当于小弟,做一些后台调度、支持性工作,比如 JVM 的垃圾回收、内存管理等线程都是守护线程。

Thread 中有个布尔值标识 daemon 当前线程是否为守护线程,daemon 属性需要在调用线程的 start() 方法之前调用。

一个进程中,如果所有线程都退出了,Java 虚拟机就会退出。注意了,这里的“所有”就不包括守护线程,也就是说,当除守护线程外的其他线程都结束后,Java 虚拟机就会退出,然后将守护进程终止。

这里需要注意的是,由于上述特性,Java 虚拟机退出后,在守护线程中的 finally 块中的代码不一定执行。

package com.thread;

public class DeamonThreadTest {

    static class DeamonThread extends Thread{
        public void run() {
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } finally {
                System.err.println(Thread.currentThread().getName() + " final block run...");
            }
        }
    }

    public static void main(String[] args) {

        DeamonThread dt = new DeamonThread();
        dt.setDaemon(true);
        dt.start();
    }

}

上述代码中将线程设置为守护线程,由于 main 线程启动 DaemonThread 后就结束,此时虚拟机中没有非守护线程,虚拟机也会退出,守护进程被终止,但是它的 finally 块中的内容却没有被调用。

因此,守护线程中不能依靠 finally 块进行资源关闭和清理。

3、生命周期

线程状态介绍备注
NEW新创建还未调用 start() 方法;还不是活着的 (alive)
RUNNABLE就绪的调用了 start() ,此时线程已经准备好被执行,处于就绪队列;是活着的 (alive)
RUNNING运行中线程获得 CPU 资源,正在执行任务;(alive)
BLOCKED阻塞的线程阻塞于锁或者调用了 sleep;(alive)
WAITING等待中线程由于某种原因等待其他线程;(alive)
TIME_WAITING超时等待与 WAITING 的区别是可以在特定时间后自动返回;(alive)
TERMINATED终止执行完毕或者被其他线程杀死;(dead)

(待续)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值