详解Java线程创建和线程通讯

线程通讯

目录

11:线程通讯一般有如下几种方法

11.2:线程通讯CountDownLatch方式

11.3:使用CyclicBarrier方式进行线程通讯

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

视频地址:https://www.bilibili.com/video/BV1m4411u7xK

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值