1.什么是线程?
线程是操作系统能够进行运算调度的最小单位。
2、线程和进程有什么区别?优缺点?
(1)根本区别:进程是操作系统资源分配的基本单位,线程是任务调度和执行的基本单位
(2)进程是独立的
(3)一个程序至少有一个进程,一个进程至少有一个线程
(4)线程的划分尺度小于进程,使得多线程程序的并发性高
优缺点:线程执行开销小,但不利于资源的管理和保护,进程正好相反
3、什么是线程阻塞?
线程阻塞通常是指一个线程在执行过程中暂停,以等待某个条件的触发
4、什么是线程死锁?
死锁是由于两个对象在拥有一份资源的情况下申请另一份资源,而另一份资源恰好又是这两个对象所持有的,导致两个对象无法完成操作,且所持资源无法释放。
5、Java如何实现线程?
(1)继承(extends)Thread类覆盖run()方法即可,这中方法的缺点是,一个Java类只能继承一个父类
(2)实现Runnable接口,实现run()方法即可(最常用的方式),可满足Java多继承
(3)implements Callable,实现call()方法即可
6、Thread类中start()和run()方法的区别?
start()方法被用来启动新创建的线程,而且start()内部调用了run()方法,这和直接调用run()方法效果不一样,调用run()方法时,只会是在原来的线程中调用,没有启动新的线程,start()方法会启动新的线程
7、线程的5种状态?
五种状态:创建、就绪、运行、阻塞和死亡
8、Java中Runnable和Callable有什么不同?
主要区别:Callable的 call() 方法可以返回值和抛出异常,而Runnable的run()方法没有这些功能
9、Java中什么是竞态条件?
当两个线程竞争同一资源时,如果对资源的访问顺序敏感,就称存在竞态条件。导致竞态条件发生的代码区称作临界区。在临界区使用适当的同步就可以避免竞态条件。
临界区有两种实现方法:(1)一种是用snychronized(2)用lock显示锁实现
10、如何在两个线程间共享数据?
通过共享对象来实现这个目的
11、Java种notify和notifyAll有什么区别?
(1)notify()不能唤醒某个具体的线程,所以只有一个线程在等待的时候它才有用武之地
(2)notifyAll()唤醒所有线程并允许他们之间争夺锁,确保了至少有一个线程能继续运行
12、什么是线程池?
线程池是一种多线程的处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务
13、Java种常用的三种线程池?
(1)FixedThreadPool:这是一个线程数固定的线程池,当这个线程池被创建的时候,池里的线程数就已经固定了
(2)SingleThreadExecutor:这是一个线程数量为1的线程池,所有提交的这个线程池的任务都会按照提交的先后顺序排队执行
(3)CachedThreadPool:缓存有关的线程池
14、如何避免线程死锁?
线程死锁必须满足的四个条件:
(1)互斥条件:一个资源每次只能被一个进程使用
(2)请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放
(3)不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。
(4)循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系
避免线程死锁最简单的方法就是阻止循环等待条件
15、有三个线程T1,T2,T3,怎么确保它们按顺序执行?
使用线程类种的join()方法,在一个线程中启动另一个线程,另外一个线程完成该线程继续执行
16、java多线程中调用wait()和sleep()方法有什么不同?
Java程序中wait和sleep都会造成某种形式的暂停,他们可以满足不同的需求。
(1)wait()方法用于线程间的通信,如果等待条件为真且其他线程被唤醒时它会释放锁
(2)sleep()方法仅仅释放CPU资源或者让当前线程停止执行一段时间,但不会释放锁