1.什么是线程
线程是操作系统运算调度的最小单位,是实际运作单位。 进程是正在运行着的应用程序。
2.线程五大状态:
创建状态:new:三种方式创建,还没有start
就绪状态:runnable:线程创建之后,调用Thread类的start()方法,进入就绪状态,
运行状态:running:线程得到cpu分配,进入运行状态
阻塞状态:blocked:运行中的线程进入阻塞状态,如调用sleep()方法让线程睡眠,调用wait()方法让线程等待等。
终止状态:(Dead):当线程的run()方法完成时,或者主线程的main()方法完成时,我们就认为它终止了。
3.线程创建方式:
继承Thread类
实现runnable接口
实现callable接口
通过线程池创建
4.用Runnable还是Thread?
大家都知道我们可以通过继承Thread类或者调用Runnable接口来实现线程,问题是,那个方法更好呢?什么情况下使 用它?这个问题很容易回答,如果你知道Java不支持类的多重继承,但允许你调用多个接口。所以如果你要继承其他类,当然是调用Runnable接口好了。
5.Thread 类中的start() 和 run() 方法有什么区别?
start()方法被用来启动新创建的线程,而且start()内部调用了run()方法,这和直接调用run()方法的效果不一样。当你调用run()方法的时候,只会是在原来的线程中调用,没有新的线程启 动,start()方法才会启动新线程
6..Java中Runnable和Callable有什么不同?
Runnable和Callable都代表那些要在不同的线程中执行的任务。Runnable从JDK1.0开始就有了,Callable是在 JDK1.5增加的。它们的主要区别是Callable的 call() 方法可以返回值(Future对象)和抛出异常,而Runnable的run()方法没有这些功能。Callable可以返回装载有计算结果的Future对象。
7.什么是线程池? 为什么要使用它?
创建线程要花费昂贵的资源和时间,如果任务来了才创建线程那么响应时间会变长,而且一个进程能创建的线程数有限。为了避免这些问题,在程序启动的时 候就创建若干线程来响应处理,它们被称为线程池,里面的线程叫工作线程。从JDK1.5开始,Java API提供了Executor框架让你可以创建不同的线程池。比如单线程池,每次处理一个任务;数目固定的线程池或者是缓存线程池。
ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(5, 10, 5, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>());
参数配置:核心线程数、线程最大数、线程保存时间、线程失效时的返回函数
8.Java中notify 和 notifyAll有什么区别?
notify()方法不能唤醒某个具体的线程,所以只有一个线程在等 待的时候它才有用武之地。而notifyAll()唤醒所有线程并允许他们争夺锁确保了至少有一个线程能继续运行。
9.wait, notify 和 notifyAll这些方法不在thread类里面?
他们是针对对象加锁的。
10.为什么wait和notify方法要在同步块中调用?
wait和notify方法执行的时候必须先获得对象,还有一个原因是为了避免wait和notify之间产生竞态条件。
11.Java中的volatile变量是什么
作用于共享变量,保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对其他线程来说是立即可见的。volatile保障的是可见性和有序性(禁止指令重排),不保证原子性。
12.如何避免死锁?
死锁是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。
发生情况:
互斥:一个资源每次只能被一个进程使用
请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放
不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺
循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。
如何避免:避免死锁最简单的方法就是阻止循环等待条件,将系统中所有的资源设置标志位、排序,规定所有的进程申请资源必须以一定的顺序(升序或降序)做操作来避免死锁。
13.Java中活锁和死锁有什么区别?
互相避让导致谁也出不去、就是状态可改变但是任然不可以执行。
14.怎么检测一个线程是否拥有锁?ava.lang.Thread中有一个方法叫holdsLock()
15.volatile 变量和 atomic 变量有什么不同? volatile 保证的是可见性和有序性,atomic 保证的是原子性。
16.同步块内的线程抛出异常会发生什么?锁会自动释放
17.Java多线程中调用wait() 和 sleep()方法有什么不同?
wait() 释放锁,sleep()不释放锁。
18.单例模式的双检锁?
既保证了线程安全,又比直接上锁提高了执行效率,还节省了内存空间。
19.各种锁:https://blog.csdn.net/qq_43542795/article/details/105970892?ops_request_misc=&request_id=&biz_id=102&utm_term=%E9%94%81%E8%86%A8%E6%B6%A8&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-3-.pc_search_result_control_group&spm=1018.2226.3001.4187
20.很多线程怎么区分是哪个日志?
给线程命名,然后添加append日志到后面;
NIO BIO AIO