1.多线程有什么用?
1)发挥多核CPU 的优势
随着工业的进步,现在的笔记本、台式机乃至商用的应用服务器至少也都是双核的 ,4 核、8 核甚至 16 核的也都不少见,如果是单线程的程序,那么在双核 CPU 上 就浪费了 50%, 在 4 核 CPU 上就浪费了 75%。单核 CPU 上所谓的"多线程"那是 假的多线程,同一时间处理器只会处理一段逻辑,只不过线程之间切换得比较快, 看着像多个线程"同时"运行罢了。多核 CPU 上的多线程才是真正的多线程,它能 让你的多段逻辑同时工作,多线程,可以真正发挥出多核CPU 的优势来,达到充 分利用CPU 的目的。
2)防止阻塞
从程序运行效率的角度来看,单核 CPU 不但不会发挥出多线程的优势,反而会因 为在单核CPU 上运行多线程导致线程上下文的切换,而降低程序整体的效率。但 是单核 CPU 我们还是要应用多线程,就是为了防止阻塞。试想,如果单核 CPU 使 用单线程,那么只要这个线程阻塞了,比方说远程读取某个数据吧,对端迟迟未返 回又没有设置超时时间,那么你的整个程序在数据返回回来之前就停止运行了。多 线程可以防止这个问题,多条线程同时运行,哪怕一条线程的代码执行读取数据阻 塞,也不会影响其它任务的执行。
3)便于建模
这是另外一个没有这么明显的优点了。假设有一个大的任务 A,单线程编程,那么 就要考虑很多,建立整个程序模型比较麻烦。但是如果把这个大的任务 A 分解成 几个小任务,任务B、任务 C、任务 D,分别建立程序模型,并通过多线程分别运 行这几个任务,那就简单很多了。
2.线程和进程的区别是什么?
进程和线程的主要差别在于它们是不同的 *** 作系统资源管理方式。进程有独立的地 址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一 个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的 地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程 序健壮,但在进程切换时,耗费资源较大,效率要差一些。但对于一些要求同时进 行并且又要共享某些变量的并发 *** 作,只能用线程,不能用进程
3.一个线程的生命周期有哪几种状态?它们之间如何流转的?
- NEW:毫无疑问表示的是刚创建的线程,还没有开始启动。
- RUNNABLE: 表示线程已经触发start()方式调用,线程正式启动,线程处于运行中 状态。
- BLOCKED:表示线程阻塞,等待获取锁,如碰到 synchronized、lock 等关键字等占用临界区的情况,一旦获取到锁就进行
RUNNABLE 状态继续运行。 - WAITING:表示线程处于无限制等待状态,等待一个特殊的事件来重新唤醒,如 通过wait()方法进行等待的线程等待一个notify()或者 notifyAll()方法,通过 join()方法进行等待的线程等待目标线程运行结束而唤醒,一旦通过相关事件唤醒线程,线 程就进入了 RUNNABLE 状态继续运行。
- TIMED_WAITING:表示线程进入了一个有时限的等待,如 sleep(3000),等待 3 秒 后线程重新进行 RUNNABLE状态继续运行。
- TERMINATED:表示线程执行完毕后,进行终止状态。需要注意的是,一旦线程 通过 start 方法启动后就再也不能回到初始 NEW状态,线程终止后也不能再回到 RUNNABLE 状态
4.线程中的 wait()和 sleep()方法有什么区别?
- 这个问题常问,sleep 方法和 wait 方法都可以用来放弃 CPU 一定的时间,不同点在 于如果线程持有某个对象的监视器,sleep方法不会放弃这个对象的监视器,wait 方法会放弃这个对象的监视器
5.什么是死锁?如何避免死锁?
- 死锁就是两个线程相互等待对方释放对象锁。
6.多线程之间如何进行通信?
- wait/notify
7、线程怎样拿到返回结果?
- 实现Callable 接口。
8.为什么要使用线程池?
- 我们知道不用线程池的话,每个线程都要通过 new Thread(xxRunnable).start()的方式来创建并运行一个线程,线程少的话这不会是问题,而真实环境可能会开启多个线程让系统和程序达到最佳效率,当线程数达到一定数量就会耗尽系统的CPU 和 内存资源,也会造成 GC频繁收集和停顿,因为每次创建和销毁一个线程都是要消耗系统资源的,如果为每个任务都创建线程这无疑是一个很大的性能瓶颈。所以,线程池中的线程复用极大节省了系统资源,当线程一段时间不再有任务处理时它也 会自动销毁,而不会长驻内存
9.线程数过多会造成什么异常?
- 线程过多会造成栈溢出,也有可能会造成堆异常。
10.如何创建线程安全的单例模式?
- 1、懒汉式 类加载的时候就创建实例
- 2、饿汉式 使用的时候才创建实例
11.提交任务时线程池队列已满会时发会生什么?
- 当线程数小于最大线程池数 maximumPoolSize 时就会创建新线程来处理,而线程 数大于等于最大线程池数maximumPoolSize 时就会执行拒绝策略。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)