Java高级(五)多线程编程

1.理解线程的概念

①多线程编程的应用

IDM 多线程下载

迅雷打开 ->迅雷的进程启动(应用程序的执行实例)

②多线程编程的概念

线程:进程中执行运算的最小单位。

单线程:你开启了一个下载 如果这个下载没有结束 不能开启新的下载任务浪费资源

多线程:你开启了一个下载 同时还可以下载其他的充分利用资源(不安全)多线程并不是同时执行,而是交替使用CPU资源
举例:我们真的是同时上网?

交换机 快速的切换 最后给你的感觉就是 同时上网

并发:同时访问同一个资源

2.掌握线程的创建和启动

线程类所在的包:java.lang.Thread
每一个进程 一定有且仅有一个主线程。(而目前我们的Java程序 主线程是main) 最先开始 最后结束

实现多线程的两种方式

1.继承Thread类来定义线程
①继承Thread类(自定义线程)
②重写run()方法 线程执行的操作
③创建线程对象
④调用start()方法 启动线程 -> 调用run()方法 和其他线程抢占式争夺CPU资源 来执行

Java单继承 局限性 如果继承了Thread那么无法再去继承其他的
2.实现Runnable接口(推荐)
①实现Runnable接口(线程的一个组件 需要后续通过Thread帮你创建线程对象)
②重写run()方法
③创建Runnable接口实现类
④创建线程对象 传递Runnable接口实现类
⑤启动线程

3.直接调用run()方法和调用start()方法的区别:
run()方法 就是在调用类里面的某个普通方法而已。 它只会有一个线程main
start()方法 它会开启新的线程 然后去自动调用线程的操作(run()方法) 它会有多个线程 开始交替执行

3.了解线程的状态[面试题]

创建状态 : 当你new 线程的时候

就绪状态 : 当你调用了start()方法

运行状态 : 当该线程获取了CPU资源(如果没获取 还是处于就绪状态)

阻塞状态 : 当用户输入或者休眠的时候 如果退出阻塞 会进入就绪状态重新等待争抢

死亡状态 : 线程自然执行完毕/外部干涉终止线程

4.掌握线程调度的常用方法

默认优先级为5 最大优先级为10 最小优先级为1
1.void setPriority(int priority); 设置线程优先级

2.void sleep(long xx); 设置线程的休眠时间(单位为毫秒值) 会进入阻塞状态

3.void join(long xx); 强制执行线程 将当前线程停止 让其他线程先执行结束之后 再执行自己

4.void yield(); 线程的礼让 只是提供一种可能 并不一定实现礼让

5.wait(); 调用wait()方法会挂起当前线程,并释放共享资源的锁

6.notify(); 在调用wait()方法阻塞的线程中,随机选择一个解除阻塞。

7.notifyAll(); 在调用wait()方法阻塞的线程中,一次性全部解除阻塞。

5.掌握线程的同步

[多线程] 对 [共享资源] 有[修改]的操作 , 那么就可能引发线程安全的问题。
1.同步关键字
2.同步代码块

6.理解线程安全的类型

1.StringBuffer、StringBuilder、String的区别
StringBuffer 和 StringBuilder都是可变字符串
StringBuffer是线程安全的 效率低 StringBuilder线程不安全 效率高
String是不可变字符串 每一次改变都在新建字符串

2.HashTable和HashMap的区别
共同点:
HashTable和HashMap都是实现自Map接口
不同点:
1.HashTable是线程安全的
HashMap是线程不安全的

2.HashTable不支持键和值为null
HashMap支持键和值为null