一、线程和进程的概念、并行和并发的概念html
二、建立线程的方式及实现java
建立线程的三种方式及实现代码:面试
public class MyThread extends Thread{//继承Thread类 public void run(){ //重写run方法 } } public class Main { public static void main(String[] args){ new MyThread().start();//建立并启动线程 } }
2. 实现Runnable接口建立缓存
public class MyThread2 implements Runnable {//实现Runnable接口 public void run(){ //重写run方法 } } public class Main { public static void main(String[] args){ //建立并启动线程 MyThread2 myThread=new MyThread2(); Thread thread=new Thread(myThread); thread().start(); //或者 new Thread(new MyThread2()).start(); } }
3. 使用Callable和Futura建立安全
三、进程间通讯的方式多线程
进程间的通讯(IPC)经常使用方式管道(无名管道和命名管道)、消息队列、信号量、共享存储、套接字(Socket)及Streams等。其中 Socket和Streams支持不一样主机上的两个进程IPC。并发
四、说说 CountDownLatch、CyclicBarrier 原理和区别工具
原理: 参考:https://blog.csdn.net/wantflydacheng/article/details/81664035
ui
区别:spa
五、说说 Semaphore 工做原理,举例说明
Semaphore主要用于控制当前活动线程数目,就如同停车场系统通常,而Semaphore则至关于看守的人,用于控制总共容许停车的停车位的个数,而对于每辆车来讲就如同一个线程,线程须要经过acquire()方法获取许可,而release()释放许可。若是许可数达到最大活动数,那么调用acquire()以后,便进入等待队列,等待已得到许可的线程释放许可,从而使得多线程可以合理的运行
六、说说 Exchanger 原理
Exchanger(交换者)是一个用于线程间协做的工具类。Exchanger用于进行线程间的数据交换。它提供一个同步点,在这个同步点两个线程能够交换彼此的数据。这两个线程经过exchange方法交换数据, 若是第一个线程先执行exchange方法,它会一直等待第二个线程也执行exchange,当两个线程都到达同步点时,这两个线程就能够交换数据,将本线程生产出来的数据传递给对方。所以使用Exchanger的重点是成对的线程使用exchange()方法,当有一对线程达到了同步点,就会进行交换数据。所以该工具类的线程对象是成对的。
Exchanger类提供了两个方法,String exchange(V x):用于交换,启动交换并等待另外一个线程调用exchange;String exchange(V x,long timeout,TimeUnit unit):用于交换,启动交换并等待另外一个线程调用exchange,而且设置最大等待时间,当等待时间超过timeout便中止等待。
参考:https://blog.csdn.net/carson0408/article/details/79477280
七、ThreadLocal 原理分析,ThreadLocal为何会出现OOM,出现的深层次原理
八、讲讲线程池的实现原理
一个线程集合workerSet和一个阻塞队列workQueue。当用户向线程池提交一个任务(也就是线程)时,线程池会先将任务放入workQueue中。workerSet中的线程会不断的从workQueue中获取线程而后执行。当workQueue中没有任务的时候,worker就会阻塞,直到队 列中有任务了就取出来继续执行。
几个重要参数意义:
九、线程池的几种实现方式
十、线程的生命周期,状态是如何转移的
生命周期: 新建(New)、就绪(Runnable)、运行(Running)、阻塞(Blocked)和死亡(Dead)5种状态
状态转移:
1. 新建状态,当程序使用new关键字建立了一个线程以后,该线程就处于新建状态,此时仅由JVM为其分配内存,并初始化其成员变量的值
2. 就绪状态,当线程对象调用了start()方法以后,该线程处于就绪状态。Java虚拟机会为其建立方法调用栈和程序计数器,等待调度运行
3. 运行状态,若是处于就绪状态的线程得到了CPU,开始执行run()方法的线程执行体,则该线程处于运行状态
4. 阻塞状态,当处于运行状态的线程失去所占用资源以后,便进入阻塞状态
5. 在线程的生命周期当中,线程的各类状态的转换过程
参考:https://www.cnblogs.com/sunddenly/p/4106562.html
另有线程相关面试题:https://mp.weixin.qq.com/s/rW0H5oez1IfMOtaPBwWGoA(可能和上面的有重复)