线程通讯
目录
11.4:Semaphore(信号量方式)方式实现线程通讯;(会造成脏读)
1:继承Thread类实现run()方法。然后new实例之后启动即可。
2:实现Runnable接口,实现run方法,然后new Thread(new MyRunnable),启动线程即可。
3:实现Callable接口,实现call方法(相比与run方法,此方法带有返回值),创建FutureTask实例,新建线程传入参数:
4:线程池(常用)
线程池接口Excute的继承关系
本次实现固定数量线程池,还有其他三种“
5:以上几种方式,创建单一线程时推荐通过接口实现,理由如下:
6: Runnable和Callable比较
7:线程的生命周期图
8:线程阻塞情况分析
9:七种方法解决线程同步问题
- 其中ReenreantLock同步锁有Lock()和unLock方法,进行加锁取锁的操作。两个方法一定要成对出现(避免死锁),且在lock后加一个try catch捕获异常,通知finnally内写入解锁unLock()方法;
- 重入锁的概念是在需要锁的时候调用方法,依然可以拿到锁
- private Lock lock = new ReenreantLock(true);//参数是是否创建公平锁,表示多个线程是否都公平拥有执行权,非公平锁又称独占锁;
10:Lock锁和synchronized的区别
11:线程通讯一般有如下几种方法
- CountDownLatch方便实现生产者消费者问题。A加锁,非A解锁
- 其中wait,notify都是锁object的方法,在同步代码块中调用obj.notify(),通知另一个进程执行。调用obj.wait(),等待另一个线程执行结束
- ReenreantLock配合Condition使用,使用Condition的await等方法[Lock lock = new ReenreantLock();Condition condition = lock.newCondition();],然后在需同步的代码块前后进行lock和unlock操作
wait和await等的区别:
11.2:线程通讯CountDownLatch方式
- 是jdk1.5之后引用的,在Concurrent包下;
- 能够使一个线程等待其他线程完成各自工作之后在执行;
- CountDownLatch是通过一个计数器来实现的,计数器的初始值为线程个数;
- 示例图如下:
- 主要实例代码(三个运动员,一个教练,教练只有等待所有运动员准备完成之后才可以开始训练):
CountDownLatch countDownLatch = new CountDownLatch(3);
运动员线程:Thread.sleep(1000);countDownLatch.countDown();//等待并进行减一操作
教练线程:countDownLatch.await();//如果没有减至0,则一直等待
主线程:Thread thread1 = new Thread(new Runnable(){public void run(){demo.racer}}).start;//开启线程1执行运动员;
Thread thread2 = new Thread(new Runnable(){public void run(){demo.racer}}).start;//开启线程2执行运动员
Thread thread3 = new Thread(new Runnable(){public void run(){demo.racer}}).start;//开启线程3执行运动员
Thread thread4 = new Thread(new Runnable(){public void run(){demo.coach}}).start;//开启线程4执行教练线程
注:上述代码可以用线程池或者单写一个继承Runnable接口的类,以简化代码;
11.3:使用CyclicBarrier方式进行线程通讯
- CyclicBarrier是在jdk1.5之后引入的
- CyclicBarrier实现让一组线程等待某个状态之后全部执行(类似于跑步比赛)
- CyclicBarrier底层是基于ReenreantLock和Condition实现的
实例代码:CyclicBarrier cyclicBarrier = new CyclicBarrier(3);//准备同时开启的线程数;
demo.onStart方法:String name = Thread.currentThread().getName();
System.out.println(name+"正在启动……");
Thread.sleep(1000);
System.out.println(name+"启动完成……");
主方法:启动三个线程分别调用demo.onStart()方法,结果显示三个线程同时启动;
11.4:Semaphore(信号量方式)方式实现线程通讯;(会造成脏读)
- Semaphore是在jdk1.5之后引入的
- Semaphore用于控制对某种资源的访问权限
代码如下图:
12:sleep和wait的区别
wait和notify区别(根据下面描述注意区分notify和notifyAll)
多线程进阶:https://blog.csdn.net/qq_38869493/article/details/105042339
线程池:https://blog.csdn.net/qq_38869493/article/details/105054955