多线程
- 线程的创建和使用
- 线程的生命周期
- 线程的同步
- 线程的通信
线程的创建与使用
程序、进程、线程
程序:为了完成某种任务或功能、用某种语言编写的一组命令的集合
进程:正在运行的一个程序
线程:进程的进一步细化,是程序内部的执行路径
线程的创建与使用:
创建多线程有两种办法:
方式一、继承Thread类
创建继承于Thread类的方法----> 重写run()方法-----> 创建Thread类对象-----> 通过对象调用start()方法
方式二、实现runnable接口
创建实现runnable接口的类----> 实现run()方法-----> 创建Thread类对象-----> 将实现类作为参数放进Thread类构造器----->通过Thread类实例调用start方法
给主线程命名
Thread01.currentThread().setName("目前是主线程");
线程的优先级设置
-
设置/设置优先级:set/getpriority() -
设置线程优先级,要在start方法前设置 -
线程优先级最大为10,最小为1,默认是5
runnable接口的线程安全问题
安全问题举例:编写一个模拟卖票的程序,开启了三个线程售票并输出票号,有一定概率出现重号、错号的现象
原因:当一个线程正在操作操作还未完成时,其他线程参与进来
解决办法:
1、同步代码块(操作共享数据的代码,就是需要被同步的代码)
使用synchronized(同步监视器){
//需要被同步的代码
}
同步监视器,俗称“锁”,任何一个类的对象,都可以充当锁
要求:多个线程必须同用一把锁
2、同步方法:将操作共享数据的代码声明在一个方法中,这个方法就是同步方法
Thread类的线程安全问题
1、同步代码块(操作共享数据的代码,就是需要被同步的代码)
使用synchronized(同步监视器){
//需要被同步的代码
}
由于继承的方式需要创建多个对象,所以锁需要是静态的。
或者 锁可以使用当前对象this充当(慎用)
2、同步方法
Thread类由于会创造多个对象,所以同步方法要写成:
public static synchronized void 方法名(){
//共享数据的代码
}