「这是我参与11月更文挑战的第5天,活动详情查看:2021最后一次更文挑战」 核心线程和非核心线程的区别?
- 向线程池提交任务时,首先创建核心线程运行的任务,直到核心线程达到上限,然后会将任务放到阻塞队列
- 只有核心线程数达到上限,且阻塞队列满的情况下,才会创建非核心线程运行任务。
- 当核心线程闲置时,不会被回收,而非核心线程则会。
线程死锁问题?
-
死锁的理解:不同线程分别占用对方需要的同步资源不放弃,都在等待对方放弃自己需要的同步资源,就形成了线程死锁。
-
说明:
- 出现死锁后,不会出现异常,不会出现提示,只是所有的线程都处于阻塞状态,无法继续执行。
- 我们使用同步时,要避免死锁。
如何理解实现Callable接口的方式创建多线程比实现Runnable接口创建线程方式强大?
- call()方法可以有返回值的。
- call()方法可以抛出异常,被外面的操作捕获,获取异常信息。
- Callable接口支持泛型。
volatile含义?
volatile关键字是用来保证变量的有序性和可见性的,防止指令进行重排序优化。
Syncronized锁,如果用这个关键字修饰一个静态方法,锁住了什么?如果修饰成员方法,锁住了什么?
- 修饰静态方法以及同步代码块:synchronized (类.class)用法锁的是类,线程想要执行对应同步代码,需要获得类锁。
- 修饰成员方法:线程获取的是当前调用该方法的对象实例的对象锁。
什么是线程池(thread pool)?
- 事先创建若干个线程放入容器中以备使用,需要的时候从线程池中拿线程不需要自己创建,用完后不用销毁放回线程池即可,从而减少线程不断创建和销毁对系统的开销,提高性能。
请说明一下线程池有什么优势?
- 降低资源的消耗,通过重复利用已创建的线程降低现成的创建的和销毁的消耗。
- 提高响应速度,当任务到达时,任务不需要等待线程的创建就能执行。
- 提高线程的管理性,使用线程可以进行统一分配,调优和监控。
sleep()方法和yield()方法有什么区别?
- sleep()方法给其他线程运行机会时不会考虑线程优先级,因此会给低优先级的线程以更大的运行机会;yield()方法只会给相同的优先级或者更高优先级的线程以运行的机会。
- 线程执行sleep()方法后线程转入阻塞状态,而执行yield()方法后会转入就绪状态。
- sleep()方法声明抛出InterruptedException,而yield()方法不会
- sleep()方法比yield()方法具有更好的移植性
请说明一下sleep() 和 wait() 有什么区别?
- sleep()是线程类的方法,导致线程暂时停止执行 一段时间,让其他线程先执行,但并不释放此时用来监控他的锁,不释放对象资源,释放CPU资源,等到指定时间过后,则自动恢复继续执行。
- wait()是Object类的方法,执行此方法后导致本线程释放监视用的对象锁,释放对象资源,释放CPU资源,将此对象放在等待锁定池,只有针对此对象发出notfiy()方法(或者notfiyAll())后本线程才进入对象锁定池准备获得对象锁重新进入运行状态。