线程&线程池
- JVM采用的第二种,创建几百个线程,观察活动监视器线程数量的变化
- JVM 提升权限陷入内核态,利用系统提供的api创建线程
- 内核线程和java线程(很多栈帧?栈帧有栈帧指令,就是字节码指令?)是一对一的,内核线程执行的就是java栈帧中的指令?
线程池的意义
- new ThreadPoolExecutor()构造函数7个参数的意思以及运行流程;
- task是否会顺序执行?
- shutdown()和shutdownNow的区别
- worker工作原理与线程池关闭过程
Lock类?
线程创建的3种方式
- 继承Thread类,重写run方法
- 创建一个类,实现Runnable接口,将这个类的对象作为Thread类构造函数的参数
- 建议用这种方式,扩展性更好。Java是单继承,多实现的,第一种方式就不能再继承其他的了
- 创建带返回值的,run方法无返回值,实现Callable接口,用FutureTask包装,将FutureTask类的对象Thread类构造函数的参数,返回值通过FutureTask的get方法获取
用户线程和守护线程setDaemon()
在Java中有两类线程:User Thread(用户线程)、Daemon Thread在Java中有两类线程:User Thread(用户线程)、Daemon Thread(守护线程)
只要当前JVM实例中尚存在任何一个非守护线程没有结束,守护线程就全部工作;只有当最后一个非守护线程结束时,守护线程随着JVM一同结束工作。
Daemon的作用是为其他线程的运行提供便利服务,守护线程最典型的应用就是 GC (垃圾回收器),它就是一个很称职的守护者。
Thread类setDaemon(true)方法可以设置一个线程为守护线程
注:
- thread.setDaemon(true)必须在thread.start()之前调用
- 在Daemon线程中产生的新线程也是Daemon的
- 当用户线程全部结束时,守护线程即使他还有任务,也会结束。
线程优先级setPriority()
线程的切换是由线程调度控制的,我们无法通过代码来干涉,但是我们可以通过提高线程的优先级来最大程度的改善线程优先获取时间片的几率
Java中线程的优先级被划分为10级,值分别为1-10,1最低,10最高。Thread类提供了3个常量来表示最低最高和默认优先级.
Thread.MIN_PRIORITY = 1;
Thread.NORM_PRIORITY = 5;
Thread.MAX_PRIORITY = 10;
void setPriority(int priority);//设制线程的优先级
线程的生命周期
常用方法
join()方法
等待某个线程运行结束,
比如main线程中 调用t1线程的start(),join()后,则main线程需要等待t1线程运行完之后继续执行,比如main线程中 调用t1线程的start(),join()后,则main线程需要等待t1线程运行完之后继续执行,main线程进入 WAITING态
join(long ms):等待某个线程运行结束,最多等待ms毫秒.TIMED_WAITING
sleep
调用 sleep 会让当前线程从 Running 进入 Timed Waiting 状态(阻塞)
其它线程可以使用 interrupt 方法打断正在睡眠的线程,这时 sleep 方法会抛出 InterruptedException
睡眠结束后的线程未必会立刻得到执行
建议用 TimeUnit 的 sleep 代替 Thread 的 sleep 来获得更好的可读性
yield
调用 yield 会让当前线程从 Running 进入 Runnable 就绪状态,然后调度执行其它线程
具体的实现依赖于操作系统的任务调度器
sychronized会使线程进入blocked状态
new Thread 会使线程进入NEW状态。
线程运行完进入terminated状态。
全面深入学习java并发编程
synchronized(对象)中的对象,可以想象为一个房间,有唯一入口门。
synchronized形象理解.
synchronized加在成员方法上的理解,原来只是锁住了当前对象,sychronized只能锁对象;
synchronized加在类方法的等同形式是什么?锁类对象。
不加synchronized的方法好比是翻窗户进去的,没法保持原子性
局部变量线程安全
public 方法 + final 不让子类去改变我的行为,
private 方法 不让子类去重写进而改变我的行为,起到一定线程安全的保护
常见线程安全的类以及他们的方法组合的线程不安全分析
设计方法内的变量时,是否线程安全 要看它是否会被暴露给其他线程
String类为什么做成final的,防止继承破坏它不可变的设计,体现了闭合原则
要分析线程安全问题,要找出临界区,临界区:多个线程对共享变量有读写操作
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!