Java 多线程模块巩固
线程状态转换
yield方法
理论上,yield意味着放手,放弃,投降。一个调用yield()方法的线程告诉虚拟机它乐意让其他线程占用自己的位置。这表明该线程没有在做一些紧急的事情。注意,这仅是一个暗示,并不能保证不会产生任何影响。
- Yield是一个静态的原生(native)方法
- Yield告诉当前正在执行的线程把运行机会交给线程池中拥有相同优先级的线程。
- Yield不能保证使得当前正在运行的线程迅速转换到可运行的状态
- 它仅能使一个线程从运行状态转到可运行状态,而不是等待或阻塞状态
线程池
Java通过Executors提供四种线程池。
- newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
- newFixedThreadPool创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
- newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行。
- newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。
参考:博客
ExecutorService的submit与execute区别
- 接收的参数不一样submit可以接受runnable无返回值和callable有返回值;execute接受runnable无返回值
- submit有返回值,而execute没有
- submit方便Exception处理
参考:博客
shotdown和showdownNow的区别
- shutdown() 方法在终止前允许执行以前提交的任务,
- shutdownNow() 方法阻止等待任务启动并试图停止当前正在执行的任务。在终止时执行程序没有任务在执行,也没有任务在等待执行,并且无法提交新任务。关闭未使用的 ExecutorService 以允许回收其资源。
Runnable与Callable区别
- callable用法和runnable一样,只不过调用的是call方法,该方法有一个泛型返回值类型,你可以任意指定。
- runnable接口实现的没有返回值的并发编程。
- callable有返回值,runnable没有返回值。
synchronized
修饰实例方法,作用于当前实例加锁,进入同步代码前要获得当前实例的锁。
1
2已当前实例为资源,当线程争夺的时候回去进行通过该实例。
不同实例之间不存在资源争抢。修饰静态方法,作用于当前类对象加锁,进入同步代码前要获得当前类对象的锁。
1
对象锁
修饰代码块,指定加锁对象,对给定对象加锁,进入同步代码库前要获得给定对象的锁。
1
对象锁