
1.Java中守护线程和本地线程区别
2.线程与进程的区别
3.什么是多线程中的上下文切换
4.死锁与活锁的区别,死锁与饥饿的区别
5.Java中用到的线程调度算法是什么
6.什么是线程组,为什么在Java中不推荐使用
7.为什么使用Executor框架
8.在Java中Executor和Executors的区别
9.什么是原子操作,在Java Concurrency API中有哪些原子类(atomic classes)
10.Java Concurrency API中的Lock接口(Lock interface)是什么,对比同步它有什么优势
11.什么是Executors框架
12.什么是阻塞队列,阻塞队列的实现原理是什么,如何使用阻塞队列来实现生产者
13.什么是Callable和Future
14.什么是FutureTask,使用ExecutorService启动任务
15.什么是并发容器的实现
16.多线程同步和互斥有几种实现方法,都是什么
17.什么是竞争条件?你怎样发现和解决竞争
18.如何使用thread dump,如何分析Thread dump
19.为什么我们调用start()方法时会执行run()方法,为什么我们不能直接调用run()方法
20.Java中你怎样唤醒一个阻塞的线程
21.在Java中CycliBarriar和CountdownLatch有什么区别
22.什么是不可变对象,它对写并发应用有什么帮助
23.Java中用到的线程调度算法是什么
24.什么是线程组,为什么在Java中不推荐使用
25.为什么使用Executor框架比使用应用创建和管理线程好
26.Java中有几种方法可以实现一个线程
27.如何停止一个正在运行的线程
28.notify()和notifyAll()有什么区别
29.什么是Daemon线程,它有什么意义
30.Java如何实现多线程之间的通讯和协作
31.什么是可重入锁(ReentrantLock)
32.当一个线程进入某个对象的一个synchronized的实例方法后,其它线程是否可进入此对象的****其它方法
33.乐观锁和悲观锁的理解及如何实现,有哪些实现方式
34.SynchronizedMap和ConcurrentHashMap有什么区别
35.CopyOnWriteArrayList可以用于什么应用场景
36.什么叫线程安全,servlet是线程安全吗
37.volatile有什么用,能否用一句话说明下volatile的应用场景
38.为什么代码会重排序
39.在java中wait和sleep方法的不同
40.一个线程运行时发生异常会怎样
41.如何在两个线程间共享数据
42.Java中notify 和 notifyAll有什么区别
43.为什么wait, notify 和 notifyAll这些方法不在thread类里面
44.什么是ThreadLocal变量
45.Java中interrupted 和 isInterrupted方法的区别
46.为什么wait和notify方法要在同步块中调用
47.为什么你应该在循环中检查等待条件
48.Java中的同步集合与并发集合有什么区别
49.什么是线程池,为什么要使用它
50.怎么检测一个线程是否拥有锁
51.你如何在Java中获取线程堆栈
52.JVM中哪个参数是用来控制线程的栈堆栈小的
53.Thread类中的yield方法有什么作用
54.Java中ConcurrentHashMap的并发度是什么
55.Java中Semaphore是什么
56.Java线程池中submit() 和 execute()方法有什么区别
57.什么是阻塞式方法
58.Java中的ReadWriteLock是什么、
59.volatile 变量和 atomic 变量有什么不同
60.可以直接调用Thread类的run ()方法么
61.如何让正在运行的线程暂停一段时间
62.你对线程优先级的理解是什么
63.什么是线程调度器(Thread Scheduler)和时间分片(Time Slicing )
64.你如何确保main()方法所在的线程是Java 程序最后结束的线程
65.线程之间是如何通信的
66.为什么线程通信的方法wait(), notify()和notifyAll()被定义在Object 类里
67.为什么wait(), notify()和notifyAll ()必须在同步方法或者同步块中被调用
68.为什么Thread类的sleep()和yield ()方法是静态的
69.如何确保线程安全
70.同步方法和同步块,哪个是更好的选择
71.如何创建守护线程
72.什么是Java Timer 类,如何创建一个有特定时间间隔的任务
1.Java中守护线程和本地线程区别
java中的线程分为两种:守护线程(Daemon)和用户线程(User)。
任何线程都可以设置为守护线程和用户线程,通过方法Thread.setDaemon(bool on);true则把该线程设置为守护线程,反之则为用户线程。Thread.setDaemon()必须在Thread.start()之前调用,否则运行时会抛出异常。
两者的区别:
唯一的区别是判断虚拟机(JVM)何时离开,Daemon是为其他线程提供服务,如果全部的User Thread已经撤离,Daemon 没有可服务的线程,JVM撤离。也可以理解为守护线程是JVM自动创建的线程(但不一定),用户线程是程序创建的线程;比如JVM的垃圾回收线程是一个守护线程,当所有线程已经撤离,不再产生垃圾,守护线程自然就没事可干了,当垃圾回收线程是Java虚拟机上仅剩的线程时,Java虚拟机会自动离开。
扩展:Thread Dump打印出来的线程信息,含有daemon字样的线程即为守护进程,可能会有:服务守护进程、编译守护进程、windows下的监听Ctrl+break的守护进程、Finalizer守护进程、引用处理守护进程、GC守护进程。
2.线程与进程的区别
进程是操作系统分配资源的最小单元,线程是操作系统调度的最小单元。
一个程序至少有一个进程,一个进程至少有一个线程。
3.什么是多线程中的上下文切换
多线程会共同使用一组计算机上的CPU,而线程数大于给程序分配的CPU数量时,为了让各个线程都有执行的机会,就需要轮转使用CPU。不同的线程切换使用CPU发生的切换数据等就是上下文切换。
4.死锁与活锁的区别,死锁与饥饿的区别
死锁:是指两个或两个以上的进程(或线程)在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。
产生死锁的必要条件:
1. 互斥条件:所谓互斥就是进程在某一时间内独占资源。
2. 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
3. 不剥夺条件:进程已获得资源,在末使用完之前,不能强行剥夺。
4. 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。
活锁:任务或者执行者没有被阻塞,由于某些条件没有满足,导致一直重复尝试,失败,尝试,失败。
活锁和死锁的区别在于,处于活锁的实体是在不断的改变状态,所谓的“活”, 而处于死锁的实体表现为等待;活锁有可能自行解开,死锁则不能。
饥饿:一个或者多个线程因为种种原因无法获得所需要的资源,导致一直无法执行的状态。
Java中导致饥饿的原因:
高优先级线程吞噬所有的低优先级线程的CPU时间。
线程被永久堵塞在一个等待进入同步块的状态,因为其他线程总是能在它之前持续地对该同步块进行访问。
线程在等待一个本身也处于永久等待完成的对象(比如调用这个对象的wait方法),因为其他线程总是被持续地获得唤醒。
5.Java中用到的线程调度算法是什么
采用时间片轮转的方式。可以设置线程的优先级,会映射到下层的系统上面的优先级上,如非特别需要,尽量不要用,防止线程饥饿。
6.什么是线程组,为什么在Java中不推荐使用
ThreadGroup类,可以把线程归属到某一个线程组中,线程组中可以有线程对象,也可以有线程组,组中还可以有线程,这样的组织结构有点类似于树的形式。
为什么不推荐使用?因为使用有很多的安全隐患吧,没有具体追究,如果需要使用,推荐使用线程池。
7.为什么使用Executor框架
每次执行任务创建线程 new Thread()比较消耗性能,创建一个线程是比较耗时、耗资源的。
调用 new Thread()创建的线程缺乏管理,被称为野线程,而且可以无限制的创建,线程之间的相互竞争会导致过多占用系统资源而导致系统瘫痪,还有线程之间的频繁交替也会消耗很多系统资源。
接使用new Thread() 启动的线程不利于扩展,比如定时执行、定期执行、定时定期执行、线程中断等都不便实现。
8.在Java中Executor和Executors的区别
Executors 工具类的不同方法按照我们的需求创建了不同的线程池,来满足业务的需求。
Executor 接口对象能执行我们的线程任务。
ExecutorService接口继承了Executor接口并进行了扩展,提供了更多的方法我们能获得任务执行的状态并且可以获取任务的返回值。
使用ThreadPoolExecutor 可以创建自定义线程池。
Future 表示异步计算的结果,他提供了检查计算是否完成的方法,以等待计算的完成,并可以使用get()方法获取计算的结果。
由于篇幅有限,这里就不一一罗列了

**还有更多资料分享如下


本文涵盖Java多线程的基础概念和技术细节,包括线程类型、线程与进程的区别、上下文切换、死锁与活锁的概念、线程调度算法等。深入探讨了Java并发编程中的关键知识点。
2869

被折叠的 条评论
为什么被折叠?



