线程对于开发人员来说并不陌生,这是进行应用程序开发的基础之一。首先我们来回顾一下线程的基本概念,线程的状态。
在java中,线程是指进程中的一组执行流程,通常有两种实现方法,一种是继承Thread类,另一种是实现Runnable接口。
线程的状态主要有5种,NEW,RUNNABLE,RUNNING,BLOCKED,DEAD,这5种状态是可以相互转换的。
从图上可以清楚的看到他们之间的转换。这里就不在赘述了。下面直接看题
一、基础篇
1.进程与线程的区别?
答:进程可看成是一个自包含的运行环境,它可以被看成一个应用。而线程可看作是其中的一个执行单元。线程可以称为轻量级进程。线程需要更少的资源来创建和存在于进程中,线程共享进程资源。
2.使用多线程编程的好处有哪些好处?
答:使用多线程可以提高程序性能,提高cpu时间的利用率。
3.用户进程与守护进程的区别?
答:在java程序中创建的进程称为用户进程,守护进程是运行在后台的。
4.如何创建一个java进程?
答:有两种方式,一种是实现Runnable接口,另一种是继承Thread类
5.进程的生命周期有哪些状态?
答:新建(NEW)、就绪(RUNNABLE)、运行(RUNNING)、阻塞(BLOCKED)、结束(DEAD)
6.能调用线程的run方法吗?
答:可以,但只能被当作普通的方法调用,要真正执行线程方法,只能通过Thread.start()来调用
7.如何暂停一个正在执行的线程?
答:可以通过调用线程的sleep方法暂停一段时间,一旦线程唤醒就变成了runnable状态,接着就会根据线程的调度来执行。
8.谈一下你对线程优先级的理解?
答:每个线程都有优先级,我们可以为每个线程指定优化级,但不能保证高优化级的线程一定会被先执行。线程的优化程分为1到10这10级,1最低,10最高。
9.线程调度器和时间切片是什么?
答:线程调度程序是将CPU时间分配给可用可运行线程的操作系统服务。一旦我们创建并启动了一个线程,它的执行就取决于线程调度程序的实现。时间分片是将可用CPU时间划分到可用可运行线程的过程。将CPU时间分配给线程可以基于线程优先级,或者等待更长时间的线程在获取CPU时间时将获得更多优先级。线程调度不能由Java来控制,所以从应用程序本身控制线程总是更好的。
10.多线程中上下文切换是什么?
答:上下文切换就是恢复存储和cpu状态的过程。
11.在java程序中我们如何确保main()是最后完成的线程?
答:我们可以使用Thread join()方法来确保程序创建的所有线程在完成主函数之前都已结束
12.线程之间如何交互?
答:对象类wait()、notify()和notifyAll()方法允许线程就资源的锁状态进行通信。
13.为什么线程通信方法wait()、notify()和notifyAll()在Object中?
答:在Java中,每个对象都有一个monitor和wait, notify方法用于等待对象monitor或通知其他线程对象monitor现在是空闲的。java中没有线程监视器,同步可以与任何对象一起使用,这就是为什么它是对象类的一部分,所以java中的每个类都有这些线程间通信的基本方法。
14.为什么必须从synchronized方法或块中调用wait()、notify()和notifyAll()方法?
答:当一个线程调用任何对象上的wait()方法时,它必须持有该对象上的一个监视器,离开时会调用notify(),它将监视器留在对象上,其他等待线程可以获得对象监视器。这些方法需要线程具有对象监视器,这只能通过同步来实现,所以需要从synchronized方法或块来调用。
15.为什么线程的sleep()和yield()方法是静态的
答:线程的sleep()和yield()方法只能在当前执行线程上工作。其他状态的线程调用是没有意义的,同时也为 了避免程序员的混淆,它们可能认为其他状态的线程也可以调用这些方法。
16.java中如何保证线程安全?
答:有这么几种方式可以实现线程安全:1.synchronized,2.原子并发类,3.实现并发锁接口4.使用volatile关键字,5.使用不可变类6.使用线程安全类
17.volatile关键字在java的作用是什么?
答:使用volatile关键字时,所有线程直接从内存中读取,而不是从线程缓存中
18.Synchronized的方法和Synchronized的代码块哪个更好?
答:synchronized代码块更好,它在执行时不会锁对象。
19.在java中如何创建守护线程?
答:在启动线程类之前调用setDaemon(true)。
20.ThreadLocal是什么?
答:ThreadLocal用于创建线程Local变量,对于同一个static ThreadLocal,不同的线程只能从中get,set,remove自己的变量,而不会影响其他的线程。
21.什么是线程组?为什么不建议使用它?
答:ThreadGroup是一个类,提供线程组有关的信息,api比较弱,对线程没有提供任何功能,现在已经标记为过时,所以不在建议使用。
22.什么是线程堆?如何获取一个程序的线程堆?
答:线程dump是JVM中所有活动线程的列表,线程dump对于分析应用程序中的瓶颈和分析死锁的情况非常有帮助。用jstack可以获取这个列表。
23.什么是死锁?如何分析和避免它?
答:至少两个以上的线程互相持有对方的资源(锁),导致线程阻塞,这种现象叫死锁。可以通过线程dump来分析死锁问题,在程序不使用嵌套锁,只锁定需要的和避免无限期等待是避免死锁情况的常用方法
24.什么是java的定时类?如何让他间隔定时执行?
答:java.util.Timer可以用于某个时间调度线程执行。可以实现JavaUTI.TimeTebug接口
25.什么是线程池?在java中如何使用?
答:线程池是用于管理线程的,它有一个队列,用于保存等待执行的任务。
java.util.concurrent.Executors可用于创建线程池,有4种类型的线程池。
newCachedThreadPool,newSingleThreadPool,newScheduledThreadPool,newFixedThreadPool.
线程池的关键参数:corePoolSize,maximumPoolSize,keepAliveTime,unit,workQueue
26.如果不能override线程类的run方法,会发生什么?
答:如果不能override线程的run方法,将不能实现我们自己的任何功能。
二、高级篇
27.什么是原子操作?
28.Executors框架是什么?
29.BlockingQueue是什么?在ThreadPool中如何使用?
30.Callable,Future,FutureTask分别如何使用?
31.Concurrency Api在java 8中有哪些新特性?
32.Lock接口与Syncronized的比较?