【Java】详解多线程通信

这篇具有很好参考价值的文章主要介绍了【Java】详解多线程通信。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

🌺个人主页:Dawn黎明开始

🎀系列专栏:Java
每日一句:什么都不做,才会来不及

📢欢迎大家:关注🔍+点赞👍+评论📝+收藏⭐️


文章目录

🔐多线程通信

(1).🔓由来

(2).🔓成员方法 

(3).🔓案例引入

(4).🔓代码实现


【Java】详解多线程通信,Java,java,开发语言,eclipse,多线程通信


🔐多线程通信

(1).🔓由来

      现代社会崇尚合作精神,分工合作在日常生活和工作中无处不在。举个简单的例子,例如一条生产线的上下两个工序,它们必须以规定的速率完成各自的工作,才能保证产品在流水线中顺利的流转。如果下工序过慢,会造成产品在两道工序之间的积压,如果上工序过慢,会造成下工序长时间无事可做。在多线程的程序中,上下工序可以看作两个线程,这两个线程之间需要协同完成工作,就需要线程之间进行通信。

思路:

      如果想解决上述线程执行不一致的问题,就需要控制多个线程按照一定的顺序轮流执行,此时就需要让线程间进行通信保证线程任务的协调进行

解决:

      为此,Java在Object类中提供了wait()notify()notifyAll()等方法用于解决线程间的通信问题,因为Java中所有类都是Object类的子类或间接子类,因此任何类的实例对象都可以直接使用这些方法。

(2).🔓成员方法 

【Java】详解多线程通信,Java,java,开发语言,eclipse,多线程通信

说明:

     其中wait()方法用于使当前线程进入等待状态,notify()和notifyAll()方法用于唤醒当前处于等待状态的线程。

注意:

     wait()、notify()和notifyAll()方法的调用者都应该是同步锁对象,如果这三个方法的调用者不是同步锁对象,Java虚拟机就会抛出IllegalMonitorStateException异常。 

(3).🔓案例引入

【Java】详解多线程通信,Java,java,开发语言,eclipse,多线程通信

生产者-消费者问题分析:

  资源:product<=20

  前台店员:Clerk

  A:从生产者线程获取资源

  B:将资源卖给消费者线程

  生产资源:ProducerThread(生产者)

  消费资源:ConsumerThread(消费者)

  测试类:Demo

(4).🔓代码实现

分析:

      A:使用同步机制

      B:线程通信问题:通过Java提供的等待唤醒机制解决。

Object类中提供了三个方法:

      wait():等待,释放锁资源

      notify():唤醒单个线程,从等待的位置继续执行

      notifyAll():唤醒所有线程

代码如下👇🏻 

package Pro;

public class Clerk {
	private int product=20;   //共享资源
	//从生产者线程获取资源
	public synchronized void addProduct(){
		if(product>=20){
			try {
				this.wait();//生产者线程等待,释放锁资源
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}else{
			product++;
			System.out.println("生产者生产第" + product + "个产品");
			this.notifyAll();
			
		}
	}
	//将资源卖给消费者线程
	public synchronized void sellProduct(){
		if(product<=0){
			try {
				this.wait();//消费者线程等待,释放锁资源
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}else{	
			System.out.println("消费者消费第"+product+"个产品");
			product--;
			this.notifyAll();
		}
		
	}

}

package Pro;

public class ProducerThread implements Runnable {
	Clerk clerk;
	
	public ProducerThread(Clerk clerk) {
		super();
		this.clerk = clerk;
	}

	@Override
	public void run() {
		while(true){
			clerk.addProduct();
			try {
				Thread.sleep((int)(Math.random()*10)*100);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}

	}

}
package Pro;

public class ConsumerThread implements Runnable {
	Clerk clerk;
	
	public ConsumerThread(Clerk clerk) {
		super();
		this.clerk = clerk;
	}

	@Override
	public void run() {
		while(true){
			clerk.sellProduct();
			try {
				Thread.sleep((int)(Math.random()*10)*100);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}

	}

}
package Pro;

public class Demo {
	public static void main(String[] args) {
		Clerk c=new Clerk();
		new Thread(new ProducerThread(c), "生产者线程甲").start();
		new Thread(new ProducerThread(c), "生产者线程乙").start();
		new Thread(new ConsumerThread(c),"消费者线程甲").start();
		new Thread(new ConsumerThread(c),"消费者线程乙").start();
//		ProducerThread pt =new ProducerThread(c);
//		Thread t1=new Thread(pt, "生产者线程甲");
//		Thread t2=new Thread(pt, "生产者线程乙");
//		ConsumerThread ct =new ConsumerThread(c);
//		Thread t3=new Thread(ct,"消费者线程甲");
//		Thread t4=new Thread(ct,"消费者线程乙");
//		t1.start();
//		t2.start();
//		t3.start();
//		t4.start();
		
	}

}

思考:

为什么这些方法不定义在Thread类而是Object类中呢?

      这些方法的调用必须通过锁对象调用,而Object类对象代表任意的对象。所以,这些方法必须定义在Object类中。


🌺建议大家亲自动手操作,学编程,多实践练习是提升编程技能的必经之路。

🌺欢迎大家在评论区进行讨论和指正!文章来源地址https://www.toymoban.com/news/detail-753011.html

到了这里,关于【Java】详解多线程通信的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java线程间通信方式

    前文了解了线程的创建方式和状态切换,在实际开发时,一个进程中往往有很多个线程,大多数线程之间往往不是绝对独立的,比如说我们需要将A和B 两个线程的执行结果收集在一起然后显示在界面上,又或者比较典型的消费者-生产者模式,在这些场景下,线程间通信成了我

    2024年02月07日
    浏览(32)
  • Java 进阶(12) 线程通信

    多个线程在处理同⼀个资源,但是处理的动作(线程的任务)却不相同。 为什么要处理线程间通信 多个线程并发执⾏时, 在默认情况下CPU是随机切换线程的,当我们需要多个线程来共同完成⼀件任务,并且我们希望他们有规律的执⾏, 那么多线程之间需要⼀些协调通信,以此

    2023年04月16日
    浏览(35)
  • Java线程之间通信方式

    在实际开发时,一个进程中往往有很多个线程,大多数线程之间往往不是绝对独立的,比如说我们需要将A和B 两个线程的执行结果收集在一起然后显示在界面上,又或者比较典型的消费者-生产者模式,在这些场景下,线程间通信成了我们必须使用的手段,那么线程之间怎么通

    2024年02月09日
    浏览(37)
  • Java线程间通信方式(3)

    前文了解了线程通信方式中的CountDownLatch, Condition,ReentrantLock以及CyclicBarrier,接下来我们继续了解其他的线程间通信方式。 Phaser Phaser是JDK1.7中引入的一种功能上和CycliBarrier和CountDownLatch相似的同步工具,相对这两者而言其用法更加灵活,同时Phaser也支持重用。 在Phaser中将需

    2023年04月27日
    浏览(30)
  • 深入理解Java线程间通信

    合理的使用Java多线程可以更好地利用服务器资源。一般来讲,线程内部有自己私有的线程上下文,互不干扰。但是当我们需要多个线程之间相互协作的时候,就需要我们掌握Java线程的通信方式。本文将介绍Java线程之间的几种通信原理。 在Java中,锁的概念都是基于对象的,

    2024年02月09日
    浏览(46)
  • java 线程安全问题 三种线程同步方案 线程通信(了解)

    线程安全问题指的是,多个线程同时操作同一个共享资源的时候,可能会出现业务安全问题。 下面代码演示上述问题,先定义一个共享的账户类: 在定义一个取钱的线程类 最后,再写一个测试类,在测试类中创建两个线程对象 某个执行结果: 为了解决前面的线程安全问题,

    2024年02月09日
    浏览(43)
  • 【计算机编程语言】JAVA-MyBatis(Eclipse)

    官网:https://mybatis.org/mybatis-3/zh/index.html 环境: JDK1.8(尽量) MySQL - 5.7(超经典) maven - 3.6.3 Eclipse 回顾: JDBC MySQL Java基础 maven Junit 框架:配置文件、最好的方式:官网文档 SSM框架:Spring SpringMVC Mybatis 1.1什么是Mybatis [外链图片转存失败,源站可能有防盗链机制,建议将图片保

    2024年02月16日
    浏览(40)
  • 由浅到深认识Java语言(9):Eclipse IDE简介

    该文章Github地址:https://github.com/AntonyCheng/java-notes 在此介绍一下作者开源的SpringBoot项目初始化模板(Github仓库地址:https://github.com/AntonyCheng/spring-boot-init-template CSDN文章地址:https://blog.csdn.net/AntonyCheng/article/details/136555245),该模板集成了最常见的开发组件,同时基于修改配置

    2024年03月25日
    浏览(44)
  • Java——》线程间是如何通信的

    推荐链接:     总结——》【Java】     总结——》【Mysql】     总结——》【Redis】     总结——》【Kafka】     总结——》【Spring】     总结——》【SpringBoot】     总结——》【MyBatis、MyBatis-Plus】     总结——》【Linux】     总结——》【MongoDB】    

    2024年02月09日
    浏览(39)
  • 编程开发8大语言详解,为什么Java是我最推荐的?

    很多没有接触过编程语言的同学,都会觉得编程开发特别高端和神奇,担心理解不了更担心学不会。 当然,也有人会认为,你既然是做编程的,那么你应该什么都会,什么软件的开发都能完成,这是平哥经常听到的两种声音。 在此,平哥需要给大家科普一下, 编程确实改变

    2024年02月05日
    浏览(70)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包