1.线程:Thread
创建多线程的方法一:
一个进程可以拥有多个线程
.start多线程的启动
(1)创建一个类继承Thread
(2)重写润run()创建多线程做什么事就放到run()内
(3)创建多线程的对象
(4)使用线程对象.start()方法启动
注意:(1)调用start() 方法 让线程 进入就绪状态 等待 CPU调度
(2)继承Thread类的情况下 可以使用
可以通过this.setName();进行名字的设置
可以通过this.getName();进行名字的获取
(3) 在非继承Thread类的情况下 可以使用
Thread.currentThread().setName(“乌龟线程”);
Thread.currentThread().getName(); 获取名字
方法二:
\1. (1)让一个类 实现 Runnable 接口
(2)重写run() 方法 线程体
(3)创建Runnable对象
(4)将此对象放入 Thread内
2.设置线程的优先级 1 ~ 10
创建一条线程 默认的优先级是5
优先级高得 多执行
优先级低的 少执行
3.继承的方式 和实现的方式 有什么区别?
(1)java只能单继承
(2)实现接口后还可以在继承一个类
(3)使用 Runnable 可以更好的实现 共享数据问题
(4)继承方式 代码更容易实现
实现接口方式 稍微麻烦一点
方法三:
1.创建一个类 实现Callable<类型>接口
2.创建接口对象
3.创建未来任务对象
4.将未来的任务放入 Thread类
5.启动线程
6.通过未来任务.get();
注意:
\1. 可以将线程的结果进行返回 自定义返回值的类型
2.可以抛出异常
\3. 继承和实现的方式 只能通过 try{}catch(){} 处理
因为 父亲 没有抛出异常 方法重写 规定不能抛出 比父类更大的异常
多个线程操作共享数据 就会有线程安全问题
多个线程操作共享数据 就会有线程安全问题
2.线程控制:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-40Iiw0PY-1595645067608)(data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)]
总结:线程生命周期
运行状态的出口:阻塞、就绪、终止
就绪状态的入口:新生、运行、阻塞
讲解了线程同步、线程通信后会增加更多的状态:增加了两种阻塞状态
join():调用join()方法的 线程 会强行插队 直到执行完毕 其他线程 才能执行
sleep():从 运行状态 到 =》 阻塞状态==》 当等待的时间结束 会重新回到就绪状态
yield(): 线程的礼让 调用当前方法的线程从运行状态===》 就绪状态
setDaemon():设置守护线程 : 当主线程结束 此线程 自动结束
stop():结束线程 直接结束
interrapt():打上中断的标记 isInterrupted():查看是否已经打上标记
3.线程同步:
当多个线程访问同一个数据时,容易出现线程安全问题。需要让线程同步,保证数据安全。
synchronized(对象)同步代码块的语法结构
注意:(1)同步代码块内可以发生线程切换
(2)在同一时刻,同步代码块内只能有一个线程其他线程只能等待
同步方法内:
语法: 在方法体返回值的前面 + synchronized
(1)同步方法的同步监视器是this
(2)同步方法可以发生线程切换
(3)同一时刻 一条线程进入同步方法 则 其他线程 不能再进入其他的同步方法
(4)线程在同步方法外进行等待
4.Lock锁:
.lock()上锁 .unlock()解锁,解锁必须在finally中进行
boolean trylock();获取一个返回值true,false 立马拿到结果
lockInterruptibly()throws
newCondition()
ReadWriteLock:读写锁
获取同一把读写锁,可以多条线程一起读,只能有一条线程进行写操作
volatile:保证变量的可见性,被他修饰的内容可见性
可以多条线程一起读
写的时候 要保证只有一条线程写
使用读写锁 完成
5. 线程通信:
当生产完一件商品后,消费者进行消费,消费者消费完一件商品,消费者等待,通知生产者生产
wait(); 可以让线程进入等待状态
调用此方法 会释放锁
notify():唤醒 使用同一个同步监视器对象的 等待的线程
notifyAll(): 唤醒所有 使用同一个同步监视器对象的等待的线程
注意:
线程通信的相关方法 需要 放到 同步代码块或者同步方法内
newCondition: wait():线程等待
signal();,signalAll();唤醒
5.线程池:ExecutorService
.shutdown()关闭线程池
创建一条线程池:newSingleinreadExecutor();
创建固定线程池:newFixedThreadPool(4);
池中线程的数量可以动态变化:Executors.newCachedThreadPool();
.submit()里边可放Callable
.execute
6.fork和join 分解,合并 ForkjoinPool
7.CountDownlatch:门闩类
new CountDownlatch(2)门闩的数量 只能有效一次
8.CyclicBarrier 回环屏障
线程池节约的是创建线程的步骤