1.并发编程三要素
(1)原子性
原子性指的是一个或者多个操作,要么全部执行,要么全不执行
(2)可见性
可见性指多个线程操作一个共享变量时,其中一个线程对变量进行修改时,其他线程变量可以立即看到修改的结果。
(3)有序性
即程序的执行顺序按照代码的先后顺序执行
2.Runnable和Callable的区别
(1) Callable规定重写的方法四call,Runnable规定重写的方法是run方法
(2)Callable的任务执行后可以返回值,而Runnable的任务是不能返回值额
(3)Call方法可以抛出异常,而run方法不可以抛出异常
(4)运行Callable方法可以拿到一个Future对象,表示异步计算的结果。它提供了检查计算是否完成的方法,以等待结果的计算,通过Future对象可以了解任务的执行情况,可以取消任务的执行,还可以获取执行的结果。
3.继承Thread类和实现Runnable接口实现线程的区别
(1)使用Thread类创建多线程
优势是
编写简单,如果访问当前线程,则无需使用Thread.currentThread方法,直接使用this即可获得当前线程
劣势是:无法继承其他的类
(2)实现Runnable接口(Callable)
优势是:可以继承其他的类,多线程共享一个Target对象,所以非常适合多个相同的线程来处理同一个资源的情况,可以将cpu,代码和数据 分开,较好的体现了面向对象的思想
劣势是:编程稍微复杂,如果访问当前线程,则必须使用Thread.currentThread()方法
4.多线程中阻塞状态分为哪几种情况
(1)等待阻塞
wait()
(2)同步阻塞
占用锁失败
(3)其他阻塞
sleep(), join()
5.什么是线程池?线程池的创建方式?
线程池:提前创建若干个线程来处理任务,当线程处理完,线程会等待下一任,任务在执行时,其他线程会等待
适用场景:频繁的创建和销毁线程
线程池的创建
(1) newCacheThreadPool() --------------->可缓存线程池
(2)newFixedThreadPool ------------------>定长线程池,可控制线程最大并发数
(3)newScheduleThreadPool ------------------>定长线程池,支持定时及周期性的任务调度
(4) newSingleThreadPool ------------------>单线程化线程池,用唯一的工作线程来执行任务
线程池优点:
(1)减少对象的创建和销毁
(2)控制最大的并发数,提高形同资源的使用率,避免过多线程造成资源竞争,形成阻塞
(3)提供定时执行,定期自行、单线程,并发控制
6.ReadWriteLock
ReentrantLock 在某些时候有局限性,使用ReenttrantLock是为了防止数据读写时造成不一致,不同的线程在读写数据时没有必要加锁。ReadWriteLock是一个读写锁接口,ReentrantLock是ReadWriteLock的具体实现,使用ReadWriteLock实现了读写分离,读锁是共享的,写锁是独占式的,提升了读写的性能。
7.FutureTask
FutureTask表示一个异步运算的任务。FutureTask里面可以传入一个Callable的具体实现类,可以对这个异步运算的结果进行等待获取、判断是否已经完成、取消任务等操作。FutureTask也是Runnable接口的实现类,所以FutureTask 也可以放到线程池中。
8.synchronized和ReentrantLock的区别
synchronized是关键字,而ReentrantLock是类,它可以对获取锁的时间进行设置,获取各种锁的信息以及灵活的实现多路通知,相比于synchronized,ReentrantLock有更好的扩展性。
9.线程类的构造方法、静态块是被哪个线程调用的
new 这个线程类的线程调用
10.提交任务时,线程池队列已经满在,这时会发生什么?
无界队列:LinkedBlockingQueue 无限存放,等待执行
有界队列:ArrayBlockingQueue 首先根据MaxMunPoolSize 的值增加线程数量,如果还是处理不过 来,则会使用拒绝策略。
11.死锁的四个条件
1、互斥条件:一个资源每次只能被一个进程使用;
2、请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放;
3、不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺;
4、循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系;
。。。。。
原文:https://www.cnblogs.com/pamne/p/11609856.html