多线程1.0
关于多线程的学习1.0(狂神说)
对于程序、进程、线程的认识

创建线程的三种方式:

创建方式一:继承Thread类,重写run()方法,调用start()开启线程

-
实现代码

- 总结:注意,线程开启不一定立即执行,由CPU调度执行。
-
为什么我们调⽤ start() ⽅法时会执⾏ run() ⽅法,为什么我们不能直接调⽤ run() ⽅法?
- new ⼀个 Thread,线程进⼊了新建状态。调⽤ start()⽅法,会启动⼀个线程并使线程进⼊了就绪状态,当分配到时间⽚后就可以开始运⾏了。start() 会执⾏线程的相应准备⼯作,然后⾃动执⾏ run() ⽅法的内容,这是真正的多线程⼯作。 但是,直接执⾏ run() ⽅法,会把 run() ⽅法当成⼀个 main 线程下的普通⽅法去执⾏,并不会在某个线程中执⾏它,所以这并不是多线程⼯作。
总结: 调⽤ start() ⽅法⽅可启动线程并使线程进⼊就绪状态,直接执⾏ run() ⽅法的话不会以多线程的⽅式执⾏。

创建方式二:实现Runnable接口,重写run()方法,执行线程需要丢入runnable接口实现类,调用start()开启线程

- 代码实现:

对于继承Thread类和实现Runnable接口的小结:
- ==这两种本质上都是通过Thread类调用start()方法,来实现线程开启run()方法。

创建方式三:实现Callable接口(了解)

实现静态代理对比Thread:

Lamda表达式:


线程五大状态:


线程状态观测:

Thread.State state = thread.getState();
- 死亡之后的线程就不能再启动了
线程有关的一些方法:



线程休眠——sleep()方法
- 模拟网络延时:放大问题的发生性
- 模拟倒计时:
- 每个对象都有一把锁,sleep不会释放锁
线程礼让——yiled()方法不一定礼让成功


线程强制执行——join()方法
- 插队的线程会强制执行


线程优先级

守护线程


浙公网安备 33010602011771号