JAVA并发编程-线程属性

205 阅读2分钟

1、什么时候需要设置守护线程

2、如果应用线程优先级来帮助程序运行?有哪些注意点?

3、不同的操作系统如何处理优先级问题?

线程各属性

  • 线程id 一定是从1开始的,但是JVM运行后,但自己创建的线程id早就不是2了。

获取id的方法

/**
 * 描述:     ID从1开始,JVM运行起来后,我们自己创建的线程的ID早已不是2.
 */
public class Id {

    public static void main(String[] args) {
        Thread thread = new Thread();
        System.out.println("主线程的ID"+Thread.currentThread().getId());
        System.out.println("子线程的ID"+thread.getId());
    }
}

可以看到结果,咦,子线程的id直接跑到了11,意味着jvm在执行过程中,创建了其他的线程。

打个断点看看,果然如此。

而为什么id是从1开始的呢,看看Thread()中的源码,一目了然

    private static synchronized long nextThreadID() {
        return ++threadSeqNumber;
    }

  • 线程名字

最好自定义与功能相关的名字,便于打日志进行调试、分析。

默认名字可以从Thread()源码看成出public Thread() { init(null, null, "Thread-" + nextThreadNum(), 0); },这个nextThreadNum呢,是这样的

    /* For autonumbering anonymous threads. */
    private static int threadInitNumber;
    private static synchronized int nextThreadNum() {
        return threadInitNumber++;
    }

因为加了synchronized,所以不会重名。

如果在初始化时没有给线程命名,可以用setName()去命名。

  • 守护线程 作用:给用户线程提供服务

特性:

1、线程类型默认继承自父线程

2、被谁启动(通常都是jvm自动启动的而不是由用户启动的,在jvm启动时,只有main是非守护线程,其他都是守护线程)

3、不影响JVM退出

4、与普通线程整体没有什么区别,也就是是否影响jvm退出。

5、不应该把自己的线程设置为守护线程(比如有个线程是处理数据的,如果只剩下这个线程了,但它又被设置为守护线程,那么JVM发现,咦只有守护线程了,就把程序退出了,就会导致数据的不一致),JVM自身提供的守护线程已经足够了

  • 线程优先级

10个级别,默认为5

程序设计不应该依赖于优先级

1、不同操作系统是不一样的

2、优先级会被操作系统改变