1、什么线程
(1)是指程序运行的时候,能够执行程序代码的一个单位,关联着要执行的代码。
2、多线程
(1)多线程:解决多任务同时执行的需求,合理使用资源。
3、进程是什么
(2)进程是一个正在执行的程序,每个进程中都有一个执行顺序,该顺序是一个执行路径,或叫一个控制单元。
4、Java 有几种方式可以实现一个线程
(1)继承 Thread 重新run()方法。
(2)实现 Runnable 实现run()方法。
(3)现实 Calllable 接口 ,重新 call()方法。
5、有几种方法实现同步
(1)同步方法 Synchronized method(){ }
(2)同步块 Synchronized(){ }
(3)使用特殊变量 (Volatitle)
(4)使用重入锁实现同步
(5)使用局部变量实现同步
6、stop()和suspend()方法为何不推荐使用?
(1)Stop 方法不安全,方法作为一种粗暴的终止行为,stop方法将终止所有未结束的方法,包括run()方法.
当一个线程停止的时候,他会立即释放所有他锁住的对象上的锁,这会导致对象处于不一样的状态。
(2)suspend 方法容易锁死,如果标志指出线程应该挂起,那么用wait()方法令其进入等待状态,
如果标志指出线程应当恢复,那么用notity()方法重新启动线程。
死锁解释:死锁是指两个或者两个以为的线程在执行的过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象。
若无外力作用,他们都无法推进下去,此时称系统处于死锁状态,这些永远在相互等待的进程称为死锁。
7、Sleep() 和wait() 有什么区别?
(1)sleep是Thread类的方法,wait是Object类的方法。
功能差不多,都用来进行线程控制,他们最大本质的区别是:
(2)sleep()不释放同步锁, wait()释放同步锁.
什么是同步锁:多个线程运行一个方法,因为方法上加了Synchronized修饰同步,
一次只有一个线程运行,其它线程进入竞争进制。
8、启动一个线程是用start()还是用run()方法
(1)启动一个线程是用Start()方法 使线程进入就绪状态,以后可以被调度为运行状态。
(2)一个线程必须关联一些具体要执行的代码,run()方法就是线程所关联的要执行的代码。
9、线程的基本状态有哪些?
(1) 线程有五种状态
(2) 创建、就绪、运行、阻塞和死亡状态。
10、简述Synchronized 和Lock的异同
(1). lock是一个接口,而synchronized是java的一个关键字,synchronized是内置的语言实现;
(2). synchronized在发生异常时候会自动释放占有的锁,因此不会出现死锁;
而lock发生异常时候,不会主动释放占有的锁,必须手动unlock来释放锁,可能引起死锁的发生。
(所以最好将同步代码块用try catch包起来,finally中写入unlock,避免死锁的发生。)
(3). lock等待锁过程中可以用interrupt来终端等待,而synchronized只能等待锁的释放,不能响应中断;
(4). lock可以通过trylock来知道有没有获取锁,而synchronized不能;
(5). Lock可以提高多个线程进行读操作的效率。(可以通过readwritelock实现读写分离)
11、线程池
(1)线程池解决的问题:由于线程的生命周期中包括,创建-就绪-运行-阻塞-挂机-结束 阶段,当我们处理的任务数目比较小的时候,我们可以自己创建几个线程来处理相应的任务,但是有大量的任务时,由于创建和销毁线程都需要很大的开销,运用线程池就可以大大的缓解这些内存开销很大的问题。
(2)线程池的思想:基本思想还是一种对象池的思想开辟一块内存空间,里面存放了众多(未死亡)的线程,池中线程执行调度由池管理器来处理。当有线程任务时,从池中取一个,执行完成后线程对象归还池,这样可以避免反复创建线程对象所带来的性能开销节省了系统的资源。
12、线程池 解决的问题
(1) 线程池 --> 经常被创建、启动、销毁也线程是非常消耗时间的
使用线程进行对线程进行管理、复用、提高程序效率;
(2) 使用线程池的好处
第一:降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。
第二:提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。
第三:提高线程的可管理性。线程是稀缺资源,如果无限制地创建,不仅会消耗系统资源,
还会降低系统的稳定性,使用线程池可以进行统一分配、调优和监控。但是,要做到合理利用
线程池,必须对其实现原理了如指掌。
13、线程池的使用方式?
(1)Executor框架的最顶层实现是ThreadPoolExecutor类,Executors工厂类中提供的newScheduledThreadPool、newFixedThreadPool、newCachedThreadPool方法其实也只是ThreadPoolExecutor的构造函数参数不同而已。通过传入不同的参数,就可以构造出适用于不同应用场景下的线程池;
(2) Executor 封装好了四种线程池 创建方式
Cached(缓存) Fixed (固定线程长度) Scheduled(时间表) Single(单线程)
(a) newCachedThreadPool (可缓存的线程池)创建一个或缓存的线程池,如果线程池的长度要处理需要可灵活回收空闲线程
若无可回收,则新建线程;
(b)newFixedThreadPool (常用,可固定线程长度,达到复用的目的) 创建一个定长的线程池,可控制最大并发数
,超出的线程会在队列中等待;
(c) newScheduledThreadPool (可定时线程池,设定线程启动的时间) 创建一个定长的线程池,支持定时及周期性任务的执行;
(d) newSingleThreadScheduledExecutor(单线程) 创建一个单线程的线程池,它只会用唯一 的工作线程来执行任务,保证所有任务按照顺序(FIFO,LIFO,优先级)执行;