线程:发挥多核CPU的优势 防阻塞 *便于建模
创建线程:继承Thread类 实现Runnable接口
start()和run()区别:
- 调用了start()方法才会表现出多线程的特性,不同线程的run()方法 里面的代码交替执行;
如果只是调用run()方法,那么代码还是同步执 行的,必须等待一个线程的run()方法里面的代码全部执行完毕之后,
另外一个线程才可以执行其run()方法里面的代码。
Runnable接口和Callable接口:
- Runnable中run()方法返回值是Void,它只执行run()方法而已
Callable中call()方法有返回值是个泛型和Future FutureTask配合可
以用来获取异步执行的结果。(Callable+Future/FutureTask)
线程安全级别:不可变 如Final类型的类 绝对线程安全 *相对线程安全
*线程非安全
一个线程如果出现了运行时异常时,如果这个异常没有被捕获的话,这个线程就停止执行了。如果这个线程持有某个对象的监听器,此监听器会被释放
Sleep方法和wait方法有什么区别:
- 都可以用来放弃cpu一定的时间;不同点在于如果线程持有某个对象的监
听器,sleep方法不会放弃这个对象的监听器,而wait方法会放弃。
生产者消费者模型作用:
- 通过平衡生产能力和消费能力来提升整个系统的运行效率 解耦,生产者和消费者联系越少越可以独自发展不受相互制约。
wait()和notify()/notifyAll()两个方法在调用前必须先获得对象的 锁。 notify()会等待线程剩余代码执行完毕才会放弃对象监听器,wait 方法会立即释放对象监听器。
- 线程池的作用:避免频繁的创建销毁线程,达到对线程的重用,线程池还可 以根据项目灵活地控制并发的数目。
线程池队列满了,若再提交任务时会发生:若使用无界队列即 LinkedBlockingQueue 则继续添加任务到阻塞队列中等待执行:若使用 有界队列ArrayBlockingQueue 任务首先会被添加到此队列中,此队列满 了则会使用拒绝策略RectedExecutionHandler处理满了的任务,默认是AbortPolicy。
单例模式的线程安全意味着:某个类的实例在多线程坏境下只会被创建一次 出来。 恶汉式单例模式–线程安全;双检锁单例模式–线程安全;懒汉式 单例模式–非线程安全。