1、Java中实现多线程有几种方法
2、继承Thread 类
3、实现Runnable 接口。
4、ExecutorService、 Callable、 Future 有返回值线程
5、基于线程池的方式
6、4种线程池
7、如何停止一个正在运行的线程
8、notify()和notifyAll()有什么区别?
9、sleep()和wait() 有什么区别?
10、volatile 是什么?可以保证有序性吗?
11、Thread 类中的start() 和 run() 方法有什么区别?
12、为什么wait, notify 和noti fy}l1这些方法不在thread类里面?
13、为什么wai t和noti fy方法要在同步块中调用?
14、Java中interrupted 和 isInterruptedd方法的区别?
15、Java中synchronized 和 ReentrantLock 有什么不同?
16、有三个线程I1, T2, T3,如何保证顺序执行?
17、SynchronizedMap和ConcurrentHashMap有什么区别?
18、什么是线程安全
19、Thread类中的yield方法有什么作用?
20、Java线程池中submitO和execute 0方法有什么区别?
21、说一说自己对于synchronized关键字的了解
22、说说自己是怎么使用 synchronized 关键字,在项目中用到了吗synchronized关键字最主要的三种使用方式
23、什么是线程安全? Vector是一个线程安全类吗?
24、volatile关键字的作用?
25、简述一下你对线程池的理解
26、线程生命周期状态)
27、新建状态(NEW)
28、就绪状态( RUNNABLE)
29、运行状态(RUNNING)
30、阻塞状态(BLOCKED)
31、线程死亡(DEAD)
32、终止线程4种方式
33、start与run区别
34、JAVA后台线程
35、什么是乐观锁
36、什么是悲观锁
37、什么是自旋锁
38、Synchronized同步锁
39、ReentrantLock
40、Condition类和0bject类锁方法区别区别
41、tryLock 和lock和lockInterruptibly 的区别
42、Semaphore信号童
43、Semaphore与Reentr antLock区别
44、可重入锁(递归锁)
45、公平锁与非公平锁
46、ReadWriteLock 读写锁
47、共享锁和独占锁
48、重量级锁(Mutex Lock)
49、轻量级锁
50、偏向锁
51、分段锁
52、锁优化
53、线程基本方法
54、线程等待(wait)
55、线程睡眠( sleep)
56、线程让步(yield)
57、线程中断(interrupt)
58、Join等待其他线程终止
59、为什么要用join0方法?
60、线程唤醒(noti fy)
61、线程其他方法
62、进程
63、上下文
64、寄存器
65、程序计数器
66、FCB-切换桢 ”
67、上下文切换的活动
68、引起线程上下文切换的原因
69、同步锁
70、死锁
71、线程池原理
72、线程复
73、线程地的组成
74、拒绝策略
75、Java线程池工作过程
76、JAVA阻塞队列原理
77、Java中的阻塞队列
78、ArrayBlockingQueue(公平、非公平)
79、LinkedBlockingQueue(两个独立锁提高并发)
80、PriorityBlockingQueue(compareTo 排序实现优先)
81、DelayQueue ( 缓存失效、定时任务)
82、Synchr onousQueue (不存储数据、可用于传递数据)
83、Linke dTr ansferQueue
84,Linke JB1ocki ngDeque
85、在java中守护线程和本地线程区别
86、线程与进程的区别?
87、什么是多线程中的上下文切换?
88、死锁与活锁的区别,死锁与饥饿的区别?
89、Java中用到的线程调度算法是什么?
90、什么是线程组,为什么在Java中不推荐使用?
91、为什么使用Executor 框架?
92、在Java 中Executor 和Executors 的区别?
93、如何在 Windows 和 Linux 上查找哪个线程使用的 CPU 时间最长?
94、什么是原子操作?在 Java Concurrency API 中有哪些原子类(atomic classes)?
95、Java Concurrency API 中的 Lock 接口(Lock interface)是什么?对比同步它有什么优势?
96、什么是Executors 框架?
97、什么是阻塞队列?阻塞队列的实现原理是什么?如何使用阻塞队列来实现生产者-消费者模型?
98、什么是Callable 和Future?
99、什么是FutureTask?使用 ExecutorService 启动任务。
100、什么是并发容器的实现?
101、多线程同步和互斥有几种实现方法,都是什么?
102、什么是竞争条件?你怎样发现和解决竞争?
103、为什么我们调用 start()方法时会执行 run()方法,为什么我们不能直接调用 run()方法?
104、Java 中你怎样唤醒一个阻塞的线程?
105、在Java 中CycliBarriar和CountdownLatch有什么区别?
106、什么是不可变对象,它对写并发应用有什么帮助
107、Java中用到的线程调度算法是什么?
108、什么是线程组,为什么在Java中不推荐使用?
继承Thread类;
实现Runnable接口;
实现(allable接口通过FutureTask包装器来创建Thread线程;
使用ExecutorService. Callable. Future实现有返回结果的多线程(也就是使用了ExecutorService来管理前面的三种方式)。.
java中的线程分为两种:守护线程(Daemon)和用户线程(User) 。
任何线程都可以设置为守护线程和用户线程,通过方法Thread. setDaemon(bool on); true则把该线程设置为守护线程,反之则为用户线程。Thread .setDaemon0必须在Thread.start()之前调用,否则运行时会抛出异常。
两者的区别:
唯一的区别是判断虚拟机(VM)何时离开, Daemon是为其他线程提供服务,如果全部的User Thread已经撤离,Daemon没有可服务的线程,JVM撒离。也可以理解为守护线程是JM自动创建的线程(但不一定),用户线程是程序创建的线程;比如JVM的垃圾回收线程是一个守护线程, 当所有线程已经撤离,不再产生垃圾,守护线程自然就没事可干了,当垃圾回收线程是Java虚拟机上仅剩的线程时,Java虚拟机会自动离开。
进程是操作系统分配资源的最小单元,线程是操作系统调度的最小单元。
一个程序至少有一一个进程,-一个进程至少有一个线程.
多线程会共同使用–组计算机上的CPU,而线程数大于给程序分配的CPU数量时,为了让各个线程都有执行的机会,就需要轮转使用CPU.不同的线程切换使用CPU发生的切换数据等就是上下文切换.
死锁:是指两个或两个以上的进程(或线程)在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。
产生死锁的必要条件:
1、互斥条件:所谓互斥就是进程在某-时间内独占资源。
2、请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
3、不剥夺条件:进程已获得资源,在末使用完之前,不能强行剥夺。
4、循环等待条件:若干进程之间形成一-种 头尾相接的循环等待资源关系。
**活锁:**任务或者执行者没有被阻塞,由于某些条件没有满足,导致一直重 复尝试,失败,尝试,失败。
活锁和死锁的区别在于,处于活锁的实体是在不断的改变状态,所谓的“活”,而处于死锁的实体表现为等待;活锁有可能自行解开,死锁则不能。
**饥饿:**一个或者多个线程因为种种原因无法获得所需要的资源,导致- -直无法执
行的状态。
Java中导致饥饿的原因:
1、高优先级线程吞噬所有的低优先级线程的CPU时间。
2、线程被永久堵塞在一一个等待进入同步块的状态,因为其他线程总是能在它之前持续地对该同步块进行访问。
3、线程在等待-一个本身也处于永久等待完成的对象(比如调用这个对象的wait方法),因为其他线程总是被持续地获得唤醒.
采用时间片轮转的方式。可以设置线程的优先级,会映射到下层的系统上面的优先级上,如非特别需要,尽量不要用,防止线程饥饿。
ThreadGroup类,可以把线程归属到某一个线程组中,线程组中可以有线程对象,
也可以有线程组,组中还可以有线程,这样的组织结构有点类似于树的形式。
为什么不推荐使用?因为使用有很多的安全隐忠吧,没有具体追究,如果需要使
用,推荐使用线程池。
每次执行任务创建线程new Thread(比较消耗性能,创建一个线程是比较耗时、耗资源的。
调用new Thread()创建的线程缺乏管理,被称为野线程,而且可以无限制的创建,线程之间的相互竞争会导致过多占用系统资源而导致系统瘫痪,还有线程之间的频繁交替也会消耗很多系统资源。
接使用new Thread()启动的线程不利于扩展,比如定时执行、定期执行、定时定期执行、线程中断等都不便实现。
Executors工具类的不同方法按照我们的需求创建了不同的线程池,来满足业务的需求。
Executor接口对象能执行我们的线程任务.
ExecutorService接口继承了Executor 接口并进行了扩展,提供了更多的方法我们能获得任务执行的状态并且可以获取任务的返回值.
使用ThreadPoolExecutor可以创建自定义线程池。
Future表示异步计算的结果,他提供了检查计算是否完成的方法,以等待计算的完成,并可以使用get(方法获取计算的结果。
以上的面试题都已整理成册,可以关注我的公众号《老男孩的架构路》领取一线大厂Java面试题总结+各知识点学习思维导图+一份400页pdf文档的Java独家面试手册!
这些资料的内容都是面试时面试官必问的知识点,篇章包括了很多知识点,其中包括了有基础知识、Java集合、JVM、多线程并发、spring原理、微服务、Netty 与RPC 、Kafka、日记、设计模式、Java算法、数据库、Zookeeper、分布式缓存、数据结构等等。