Java多线程
1. 线程与进程
可以理解成:进程是软件,线程是软件的执行路径。

2.创建线程的3种方法
2.1继承Thread

![第 0 ・ れ 、 0 「 package com. java. demo; * 20 叭 ho. 「 liweijie 3 M 厂 ト 当 ー ?. MA 、 ES を M を public class Demo { ☆ 多 窺 オ 8 る rate ト ” ・ ( 0 ” 0 長 、 叩 鼓 ic static void main(String[] args){ MyThread m ニ new MyThread() : m. start(); for(int ユ = ま く 1 の ユ + + ) イ System. out. println("}+ili* 下 土 " + i) : "C:\Program Files\Java\jdk-11.@.6\bin\java.exe" -javaagent:C:\Program Files\JetBrains\InteIIiJ I( 汗 滴 禾 下 土 6 鋤 禾 日 当 午 ② 汗 滴 禾 下 土 1 働 禾 日 当 午 1 汗 滴 禾 下 土 2 働 禾 日 当 午 2 汗 滴 禾 下 土 5](https://img2020.cnblogs.com/blog/1573783/202012/1573783-20201227160409002-1806780144.png)
2.2实现Runnable
这种创建线程的方法用的最多。

![' META-IN* 4MANlFEST.MF , , , , , Cone-des public static void main(String[] args){ /ÆiÆRunnable 创 建 一 个 任 务 対 象 MyRunnabIe 「 = new MyRunnabte() ; 创 建 - 个 线 程 , 并 为 其 分 配 - 个 任 务 new Thread(r) ; Thread t 执 行 这 个 线 程 t.start()•l for(int 0 ; 10 ; 』 + + System.out.println("hi 是 地 上 1B"*i) ; "C:\Program Fites\Java\jdk-11.@.6\bin\java.exe" 疑 是 地 上 霜@ 窗 前 明 月 光@ 疑 是 地 上 霜 1 窗 前 明 月 光 疑 是 地 上 霜 2 窗 前 明 月 光 2 -javaagent:C:\Program Files\JetBrains\Inte11iJ IDEA 2@2@](https://img2020.cnblogs.com/blog/1573783/202012/1573783-20201227160345940-537652277.png)
2.3带返回值的线程Callable

3.线程阻塞
所有耗时操作都是线程阻塞,例如:文件读取、等待用户输入。
4.线程中断
在之前的java版本中关闭一个子线程的做法是调用stop()方法,但是这个方法现在已经过时了。因为这种stop做法并不合理。因为:stop子线程,可能子线程并没有关闭一些流,这会导致一些资源占用问题。
合理的做法是:让线程自己死亡,简称自杀。用过线程中断,实现子线程自杀。



5.线程安全问题
线程不安全的原因:是由多个线程同时执行,去争抢一个数据,去同时操作一个数据,导致某个数据看到的和自己在使用时不一样。(判断和使用,中间间隔了几行代码;在判断和使用期间被其他线程插足了)
解决方案:就是让某些线程在执行中间这些代码时(判断和使用的中间时),其他线程不能插足就可以了。怎么不能插足呢?就是排队执行就可以了。
5.1同步代码块

5.2同步方法

5.3 显示锁Lock

注意:不同的线程得看同一把锁,不然起不到效果。
6.多线程通信

多线程通信:加一个标志位,通过让两个线程分别歇着(wait)、唤醒(notify)来实现。

浙公网安备 33010602011771号