CPU核心和线程数的关系
以前是一个核心一个线程
现在超线程技术 一个核心 两个线程
1、基础概念
进程:操作系统管理的最少单元
线程:CPU调度的最小单元
一个进程包含多个线程
CPU时间片轮转机制 一种调度算法RR调度
并行和并发
并行:几条路同时过
并发:10秒钟,服务器的吞吐量
高并发编程意义、好处
1、冲分利用CPU资源
2、加快用户响应时间
3、提高代码的模块化、异步化、简单化
注意事项:线程之间的安全性(多个线程对一个变量修改)线程的死锁 线程太多导致卡死
2、Thread.start .start才证明是个线程,调用native,调用底层
extends Thread 线程
implements Runnable任务 需要寄托Thread
implements Callable 有返回时 需要寄托Thread FutureTask
ThreeThread threeThread=new ThreeThread();
FutureTask<String> futureTask=new FutureTask(threeThread);
new Thread(futureTask).start();
3、重要机制
中止线程 run函数执行完(thread.interrupt修改isInterrupted为true)
thread isInterrupterd()
runnable Thread.currentThread().isInterrupterd()
Callable 同理
守护线程 setDaemon
A调用线程,设置的守护线程就守护A,A执行结束,守护线程必须结束
4、梳理面试题
1、run和start的区别?
run就是一个函数调用,start会走底层,走系统层,最终调度到run函数
2、 如何控制线程的执行顺序?
join来控制 让t1线程获取执行权利,能够做到顺序执行
3、并行和并发?
并行就是:同时走 并发:单位时间内,服务器吞吐量
4、在Java中能不能指定CPU去执行某个线程?
不能,C语言调用内核API去执行才行
5、在项目开发中,会考虑线程优先级吗?
不会,做不到,线程优先级依赖与系统的平台,不稳定的,无法对号入座,不可靠,比如:java优先级10级,操作系统只有2-3级,对不上
6、sleep和wait的区别
sleep是休眠,时间已过,就有执行的资格了,不是立即执行,是有资格,等待操作系统调度,wait是等待,需要唤醒,唤醒后,才有资格,sleep是无条件休眠,wait是某些原因等待
7、java能不能强制终端线程执行?
stop函数不推荐使用,暴力,很危险,interrupt可以处理线程的停止,是协作式的方式,不能保证立即中断。
8、如何让出当前线程的执行权?
yield,JDK内部实现才能用到,让出执行权
9、sleep和wait哪个函数会清除标记?
sleep捕获异常之前,会清除标记,再捕获异常的地方发起中断就可以中断了