java面试整理五——多线程_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > java面试整理五——多线程

java面试整理五——多线程

 2018/2/25 18:15:10  cpjsjxy  程序员俱乐部  我要评论(0)
  • 摘要:1.进程与线程的区别进程:执行中的程序,一个进程中至少包含一个线程线程:进程中负责程序执行的执行单元2.进程间相互通信的常见方式管道、信号、消息队列、套接字、共享内存3.线程间相互通信的常见方式共享变量、synchronized、lock4.线程的实现a)继承Thread类,(必须重写run()方法)i.创建线程后,需要使用start()启动线程,然后再执行run()方法ii.如果调用run()方法,相当于在主线程执行run()方法,并未创建新线程b)实现runnable接口(必须重写run(
  • 标签:面试 Java面试 多线程 Java 线程
1. 进程与线程的区别
进程:执行中的程序,一个进程中至少包含一个线程
线程:进程中负责程序执行的执行单元
2. 进程间相互通信的常见方式
管道、信号、消息队列、套接字、共享内存
3. 线程间相互通信的常见方式
共享变量、synchronized、lock
4. 线程的实现
a) 继承Thread类,(必须重写run()方法)
i. 创建线程后,需要使用start()启动线程,然后再执行run()方法
ii. 如果调用run()方法,相当于在主线程执行run()方法,并未创建新线程
b) 实现runnable接口(必须重写run()方法)
c) Executor
i. Executors,用于创先线程池,返回的线程池都实现ExecutorService接口
ii. Callable、Future,ExecutoreService提供了submit()方法,传递一个Callable,或Runnable,返回Future,如果Executor后台线程池还没有完成Callable的计算,这调用返回Future对象的get()方法,会阻塞直到计算完成。
5. 线程的状态图



a) 创建(new):准备好一个多线程对象
b) 就绪(runnable):调用start()方法,等待cpu调度
c) 运行(running):执行run()方法
d) 阻塞(blocked):暂时停止执行,可能将资源交给其他线程使用
e) 消亡(dead):由于突然中断或者子任务执行完毕,线程就会销毁
6. Wait()、sleep()、yield()
a) Wait是Object类定义的方法,sleep、yield是Thread类定义的方法
b) Sleep不会导致线程锁行为的改变(不会释放锁)
c) Wait会释放当前线程持有的锁,进入阻塞状态;调用wait后,需要其他线程执行notify、notifyAll来唤起当前被阻塞的线程
d) Yield和sleep类似,只是不能由用户指定暂停多长时间
e) Sleep可以使任意优先级的其他线程获得执行机会,yield只能让同优先级的线程获得执行机会
7. 线程的优先级
Java中线程优先级分为1-10个等级,JDK中使用三个常量来预设线程优先级
public final static int MIN_PRIORITY = 1;
public final static int NORM_PRIORITY = 5;
public final static int MAX_PRIORITY = 10;
继承性、规则性(高优先级线程总是先执行)、随机性(高优先级线程不一定先执行完)
8. 守护线程(Daemon Thread)
作用是为其他线程提供服务。thread.setDaemon(true)必须在thread.start()之前设置,否则会抛出异常
9. 同步synchronized与锁lock的区别
synchronized lock
获取 假设A线程获得锁,B线程等待。如果A线程阻塞,B线程则一直等待 分情况而定,Lock有多种获取锁的方式。大致就是线程不用一直等待,可以尝试获得锁
释放 1、 线程执行完同步代码,释放锁
2、 执行过程中出现异常,jvm会让线程释放锁 在finally块中必须释放锁,要不然容易造成线程死锁
状态 无法判断 可以判断
锁类型 可重入、不可中断、非公平 可重入、可中断、可公平(二者皆可)
性能 少量同步 大量同步
10. 锁类型
a) 可重入锁:在执行对象中所有同步方法不用再次获得锁
b) 可中断锁:在等待获取锁过程中可中断
c) 公平锁: 按等待获取锁的线程的等待时间进行获取,等待时间长的具有优先获取锁权利
d) 读写锁:对资源读取和写入的时候拆分为2部分处理,读的时候可以多线程一起读,写的时候必须同步地写
11. Java里面的Threadlocal是怎样实现的?
ThreadLocal,很多地方叫做线程本地变量,ThreadLocal为变量在每个线程中都创建了一个副本,那么每个线程可以访问自己内部的副本变量,线程之间互不影响,这样一来就不存在线程安全问题,也不会严重影响程序执行性能。ThreadLocal确实只有一个变量,但是它内部包含一个map,针对每个thread保留一个entry,如果对应的thread不存在则会调用initialValue。
12. 什么是上下文切换?
多任务处理系统中,CPU需要处理所有程序的操作,当用户来回切换它们时,需要记录这些程序执行到哪里。上下文切换就是这样一个过程。
在中断处理中,其他程序”打断”了当前正在运行的程序。当CPU接收到中断请求时,会在正在运行的程序和发起中断请求的程序之间进行一次上下文切换。
在多任务处理中,CPU会在不同程序之间来回切换,每个程序都有相应的处理时间片,CPU在两个时间片的间隔中进行上下文切换。
13. 如何确保main()方法所在的线程是Java程序最后结束的线程?
我们可以使用Thread类的join()方法来确保所有程序创建的线程在main()方法退出前结束。Join()的作用就是让主线程等待子线程结束之后才继续运行。
14. 阻塞队列(BlockingQueue)的实现原理
阻塞队列实现阻塞同步的方式就是lock锁的多条件(condition)阻塞控制。
  • class='magplus' title='点击查看原始大小图片' />
  • 大小: 151.8 KB
  • 查看图片附件
上一篇: java面试整理四——LINUX常用指令 下一篇: 没有下一篇了!
发表评论
用户名: 匿名