当前位置: 首页 > news >正文

青海建设协会网站久久建筑网cad

青海建设协会网站,久久建筑网cad,机器人少儿编程加盟,阳江网站建设推广公司电话线程间通信是指多个线程之间通过某种机制进行协调和交互,例如:线程等待和通知机制就是线程通讯的主要手段之一。 在 Java 中有以下三种实现线程等待的手段 : Object 类提供的 wait(),notify() 和 notifyAll() 方法;C…

线程间通信是指多个线程之间通过某种机制进行协调和交互,例如:线程等待和通知机制就是线程通讯的主要手段之一。

在 Java 中有以下三种实现线程等待的手段 :

  1. Object 类提供的 wait(),notify() 和 notifyAll() 方法;
  2. Condition 类下的 await(),signal()  和 signalAll() 方法;
  3. LockSupport 类下的 park() 和 unpark() 方法。

第一种方式的代码示例 : 

Object lock = new Object();
new Thread(() -> {synchronized (lock) {try {System.out.println("线程1 -> 进入等待");lock.wait();System.out.println("线程1 -> 继续执行");} catch (InterruptedException e) {e.printStackTrace();}System.out.println("线程1 -> 执行完成");}
}).start();Thread.sleep(1000);
synchronized (lock) {// 唤醒线程System.out.println("执行 notifyAll()");lock.notifyAll();
}

第二种方式的代码示例 :

// 创建 Condition 对象 (lock 可创建多个 condition 对象)
Lock lock = new ReentrantLock();
Condition condition = lock.newCondition();
// 加锁
lock.lock();
try {// 一个线程中执行 await()condition.await();// 另一个线程中执行 signal()condition.signal();
} catch (InterruptedException e) {e.printStackTrace();
} finally {lock.unlock();
}

上述两种线程间通信的方式其实是差不多的,只是 Condition 类它可以创建出多个对象。那为什么有了 Object 类的 wait 和 notify 的方式,还需要 condition 来干嘛呢 ?

答 :因为 Object 类的 wait 和 notify 只适用于一个任务队列,而 Condition 类的 await 和 signal 适用于多个任务队列,在多个任务队列的情况下,使用 Object 类的 wait 和 notify 可能会存在线程饿死的问题。

比如以上这种生产者消费者模型,当生产者,消费者(阻塞式的)都有多个的时候,并且此时任务队列里面没有任务了,所以消费者就会进入休眠状态,此时生产者需要做两件事情 : 

  1. 将任务推送到任务队列
  2. 唤醒线程

【问题所在】

①  此时如果使用 Object 类提供的 wait 和 notify,而唤醒线程是存在两种可能的:

1)唤醒了消费者 

2)唤醒了生产者

        如果是唤醒了生产者,那就出问题了,当生产者这边代码执行完了就结束了,消费者这边永远不会去消费队列里的任务了,这就会导致线程饥饿问题。

②  而 Condition 类因为可以被创建多个,所以可以使用两个 Condition 对象,一个指定唤醒生产者,一个指定唤醒消费者,这样就不会出现线程饥饿了。

【结论】

所以 Condition 类的 await 和 signal 是对 Object 类的 wait 和 notify 的一个补充,它解决了 Object 类种分组不明确的问题。

第三种方式的代码示例:

public static void main(String[] args) {Thread t1 = new Thread(() -> {LockSupport.park();System.out.println("线程1被唤醒");},"线程1");t1.start();Thread t2 = new Thread(() -> {LockSupport.park();System.out.println("线程2被唤醒");},"线程2");t2.start();Thread t3 = new Thread(() -> {try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("唤醒线程2");LockSupport.unpark(t2);},"线程3");t3.start();
}

LockSupport 类又是对 Condition 类的一个补充,它可以指定唤醒某一个线程,它解决了前两种方式不能随机指定唤醒线程的问题。

具体使用哪一种,还是要根据业务来进行选择~

http://www.yayakq.cn/news/529500/

相关文章:

  • 做一个网站需要多少钱 怎么做外贸人常用的网站
  • 太原网站搜索引擎优化新手建站1 网站建设过程一览
  • 网站开发需要技术提升网站关键词排名
  • 八年级信息技术网站建立怎么做wordpress修改源代码
  • 荆门市住房和城乡建设局网站深圳市住房和建设局电话
  • 洛阳网站推广怎么做app软件大全下载
  • 网站策划与建设阶段的推广的目标创世网络网站建设怎么样
  • 保定网站网站建设游戏网站的导航条怎么做的
  • 菜鸟网站做图查询企业信息
  • 惠州网站建设(推荐乐云践新)郑州自助建站软件
  • 网站备案 更换接入商网站做gzip压缩
  • 注册网站是什么意思深圳福田网站建设专业公司
  • 做网站用的主机多少合适网络营销项目策划书
  • 二手网站建设的策划云主机多个网站
  • 国内个人网站设计种子网站模板
  • 国内网站有哪些百度app推广
  • wordpress网站新闻有哪些做图纸的网站
  • 网站建设服务哪个便宜啊建网站选域名
  • 响应式网站建设智能优化舆情网站入口
  • 能自己做二次元人物的网站电子商务等于做网站吗
  • 做网站需要留什么条件广州建网站的公司有哪些
  • 北京住房城乡建设厅网站彩票网站怎么样建设
  • 网站备案需要什么东西wordpress分类门户主题
  • 单县网站定制中国建设银行官网站大同
  • 白云高端网站建设案例wordpress右侧菜单
  • 如何申请网站莱芜论坛二手车
  • 网站建设 自适应科技资讯网站有哪些
  • 网站优化与seo免费企业黄页
  • 网站双语怎么做广州协安建设工程有限公司网站
  • 手机网站自动跳转达内网站开发培训