一 体系化深入学习并发编程由简入繁系统梳理并发知识点( 十 )


在线程初始化时就被赋值tid = ();
而该方法是自增长的,初始值为0
private static synchronized long nextThreadID() {return ++threadSeqNumber;}
所以第一个生成的id为1,依次自增
public static void main(String[] args) {Thread thread = new Thread();System.out.println("主线程id:"+Thread.currentThread().getId());System.out.println("子线程id:"+thread.getId());}
打印结果如下:
主线程id:1子线程id:11
因为主线程是第一个创建的
而在子线程创建之前,已经有多个线程创建了
可以用或者debug的方式查看
比如 线程,是将操作系统信号发送给对应程序
是关于GC引用的线程
是负责执行对象方法
线程名称
开发人员可以为线程取名,为了更好的区分线程
没有指定名称时,会默认分配线程名称,后面的数字是从0开始自增的
public Thread() {init(null, null, "Thread-" + nextThreadNum(), 0);}...private static synchronized int nextThreadNum() {return threadInitNumber++;}
可以使用.()来修改名称
或者在创建对象的时候,
守护线程
java官方文档在有关线程最开始的介绍中就提到了守护线程
When codein somea new, and is aif and only if theis a .
当且仅当创建一个线程是守护线程时,它才是守护线程 。
也就是说,不去设置它为守护线程的话,线程默认是用户线程
When a Javaup, there isanon-(whichcalls thenamed main of someclass). The Javatountilof the:
The exitof classhas beenand thehasthe exitto take place.
Allthat are nothave died,byfrom the call to the runor byanthatthe run .
这一段是描述JVM会在有非守护线程的情况下继续运行,直到发生下面两种情况:
执行类的exit方法所有非守护线程都死亡(只剩下守护线程)
守护线程的作用,通常是用来给其他线程提供服务
比如垃圾处理器
这里有关线程类型的继承
守护线程的启动通常是被JVM启动,而不是被用户自己启动
守护线程是不影响JVM退出的,JVM只会关心用户线程是否结束
几个相关的方法:
判断是否是守护线程: final()
设置为守护线程: final void ( on)
线程优先级
Everyhas a .withareintowith lower .
the newhas itsset equal to theof the
Java设置了10个线程优先级
最低是1,最高是10,默认是5
public final static int MIN_PRIORITY = 1;public final static int NORM_PRIORITY = 5;public final static int MAX_PRIORITY = 10;
线程可以设置不同的优先级,告诉调度器我们更想要先运行哪些线程,后运行哪些线程
看起来很棒,那我们就可以通过设置优先级来控制线程执行的顺序了吗?其实不然
因为不同的操作系统对优先级的设定是不一致的
Java只是将优先级映射到操作系统上
Java设置了10个优先级,但操作系统不一定是10个优先级
比如只有7个优先级
而Linux则忽略优先级,所有线程优先级一样
并且优先级的判断是交给操作系统,而操作系统不一定是完全按照优先级的次序来决定线程运行的次序,比如系统,有时会略过优先级的设定,而让低优先级的线程先执行 。
所以通常并不采用优先级来控制程序的运行,因为这种控制不是稳定有效的
几个相关的方法:
获取当前线程优先级: final int ()
设置优先级:
final void (int )