Java多线程知识点(第一篇) - Go语言中文社区

Java多线程知识点(第一篇)


知识点目录

插图

图片来自第三方 Unsplash

在java中守护线程和本地线程的区别

java中的线程分为两种:守护线程(Daemon)和用户线程(User)

任何线程都可以设置为守护线程和用户线程,通过方法Thread.setDaemon(boolean);true则把该线程设置为守护线程,反之则为用户抛出异常。Thread.setDaemon()必须在Thread.start()之前调用,否则运行时会抛出异常

两者的区别:
虚拟机(JVM)何时离开,Daemon是为其他线程提供服务,如果全部的UserThread已经撤离,Daemon没有可服务的线程,JVM撤离。也可以理解为守护线程是JVM自动创建的线程(但不一定),用户线程是程序创建的线程,守护线程就没有工作继续执行,当垃圾回收线程是Java虚拟机上仅剩的线程时,Java虚拟机会自动离开

扩展:Thread Dump打印出来的线程信息,含有daemon字样的线程即为守护进程,可能会有:服务守护进程、编译守护进程、windows下的监听Ctrl+break的守护进程、Finalizer守护进程、引用处理守护进程、GC守护进程

线程与进程的区别

进程是操作系统分配资源的最小单元,线程是操作系统调度的最小单元。
一个程序至少有一个进程,一个进程至少有一个线程

多线程的上下文切换

多线程会共同使用一组计算机的CPU,二线程数大于给程序分配的CPU数是,为了让各个线程都有执行的机会,就需要轮转使用CPU。
不同的线程切换使用CPU发生的切换数据等就是上下文切换

死锁与活锁的区别,死锁与饥饿的区别

死锁:是指两个或两个以上的进程(或线程)在指定过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去

产生死锁的必要条件

  • 互斥条件:所谓互斥就是进程在某一时间内独占资源
  • 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放
  • 不剥夺条件:进程已获得资源,在未使用完之前不能强行剥夺
  • 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系

活锁:任务或执行者没有阻塞,由于某些条件没有满足,导致一直重复尝试、失败、尝试、失败

活锁和死锁的区别:处于活锁的实体是在不断的改变状态,所谓的“活”,而处于是死锁的实体表现为等待,活锁可能自己解开,死锁不能

饥饿:一个或多个线程因为种种原因无法获得所需要的资源,导致一直无法执行的状态

Java中导致饥饿的原因

  • 高优先级线程吞噬所有低优先级线程的资源
  • 线程被永久堵塞在一个等待进入同步块的状态,因为其他线程总是能在他之前持续对该同步块进行访问
  • 线程在等待一个本身也处于永久等待完成的对象(比如调用这个对象的wait方法),因为其他线程总是被持续地获得唤醒

Java中用到的线程调度算法

采用时间片轮转的方式,可以设置线程的优先级,会映射到下层的系统上面的优先级上,如非特别需要,尽量不要用,防止线程饥饿

什么是线程组,为什么在Java中不推荐使用

ThreadGroup类,可以把线程归属到某一个线程组中,线程组中可以有线程对象,也可以有线程组,组中还可以有线程,这样的组织结构类似于树,有安全隐患,推荐使用线程池

为什么使用Executor框架

每次执行任务创建线程 new Thread() 比较消耗性能,创建一个线程是比较耗时的、耗资源的

调用 new Thread() 创建的线程缺乏管理,被称为野线程,而且可以无限制的创建,线程之间的互相竞争会导致过多占用系统资源而导致系统瘫痪,还有线程之间的频繁交替也会消耗很多系统资源

直接使用 new Thread() 启动的线程不利于扩展,比如定时执行、定期执行、定时定期执行、线程中断等都不便实现

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/chentyit/article/details/101425005
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢