一、程序、进程、线程
1)什么是程序?
可执行文件例如:QQ.exe
2))什么是进程?
资源分配的基本单元
3)什么是线程?
调度执行的基本单位
4)线程切换(context switch)
T1线程被调度执行到指令2时,突然 T2线程调度器选中,T1将会被扔进一个缓冲中,先将T2线程执行,来回切换 直到 所有线程执行完成。
5)单核CPU设定多线程是否有意义?
有 当第一个线程在等待状态时 可以让第二个线程先执行 充分利用CPU
6)线程数是不是越大越好
不是 线程切换是需要消耗CPU资源的
7)线程数多少合适?
首先考虑的是CPU核数,一般是要进行压测才能确定设置多少线程数合适,但是也有公式来计算线程数。
8)如何优雅的结束一个线程?
stop() 不建议,已经被弃用
volatile 标志位
interrupt() + isInterrupted()
9)为什么不建议使用stop方法?
使用stop会释放所有锁,会产生数据不一致问题
二、创建线程的三种方式
1)类继承Thread方法
缺点:
-
无返回值
-
不能抛出异常
1.如何启动子线程
重写父类的run方法,将代码逻辑放在run方法内部。不能直接调用run方法,如果直接调用run方法,run方法将会是一个普通的类。
所以需要调用父类的 start方法来启动子线程。
2.设置/获取线程名
-
通过set
-
主线程: 设置:Thread.currentThead.setName(name) 获取:Therad.currentTheand.getName()
-
子线程: 设置run方法内:this.setName(name)/super.setName(name) 获取:对象.getName()
-
-
构造器
public TestThread(String name){ super(name); }
2)实现Runnable接口
-
缺点:
-
无返回值
-
不能抛出异常
3)实现Callable接口
优点:
-
有返回值
-
能抛出异常
三、线程的生命周期
四、常见方法
1) 设置优先级
1.同优先级别的线程,采取策略就是先到先服务,使用时间片策略。
2.如果优先级别高,被CPU调度的几率就高。
3.级别 1 ~ 10 默认 是 5
2)join 阻塞
当一个线程调用了join()方法,这个线程就会被先执行,它执行结束后才可以去执行其余的线程。
注意:必须先start,再join才有效
3)sleep 人为制造阻塞时间
4)设置伴随(守护)线程 setDaemon
先设置在启动
5)stop
五、线程安全
原因:多个线程在争抢资源的过程中,导致共享资源出现问题。一个线程还没有被执行完成,就被另外一个线程参与进来。
解决:
加同步 ——> 同步监视器
1)同步代码块
public class BuyTicketThread extends Thread {
static int ticketNum = 10;
public BuyTicketThread(String name){
super(name);
}
@Override
public void run() {
for (int i = 0; i < 100; i++) {
synchronized (this) {
System.out.println(this.getName() + ": 买到一张票,还剩余:" + --ticketNum);
if (ticketNum == 0){
break;
}
}
}
}
}
2)同步方法
总结1:
多线程在争抢资源,就要实现线程的同步 就要进行加锁,并且这个锁必须是共享的,必须是唯一的。
目的:解决线程安全问题。
总结2:关于同步方法
1)不要讲run()定义为同步方法
2)非静态同步方法的同步监视器是this
静态同步方法的同步监视器是 类名.class 字节码对象
3)同步代码块的效率要高于同步方法
原因:同步方法是将线程挡在了方法的外部,而同步代码块锁将线程挡在了代码块的外部,但却是方法的内部。
4)同步方法的锁是this,一旦锁住了一个方法,就锁住了所有的同步方法;同步代码块只是锁住了使用该同步监视器的代码块,而没有锁住其它监视器的代码块。
3)Lock锁
1)Lock和synchronized的区别
-
Lock是显式锁(手动开启手动关闭),synchronized是隐式锁
-
Lock只有代码块锁,synchronized有代码块锁和方法锁
-
使用Lock锁,Jvm将花费较少的时间来调度线程,性能更好,并且具有更好的扩展性。
2)优先使用顺序:
Lock —— 同步代码块 —— 同步方法
4) 线程同步的优缺点
锁 效率低 安全
效率高 不安全
2) 死锁
3)解决办法: 尽量避免锁,避免锁嵌套
=========================================================================
小白一枚~ 若有问题敬请指正