`
schy_hqh
  • 浏览: 556118 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

(多线程)多线程的通信---java5.0新实现

 
阅读更多

Lock与Condition

 

java5.0新特性:让一个锁上可以关联多个监视器对象

 

单独为生产者创建一个监视器对象,单独为消费者创建一个监视器对象

同一个锁有2组监视器,分别用来监视生产者与消费者

解决了唤醒本方线程的问题,而且等待与唤醒的目标更加清晰!

 

lock替代了synchronized

await()替代了wait()

signal()替代了notify()

signalAll()替代了notifyAll()

 

释放锁的动作一定要放在finally中,确保任何情况下锁都会被释放

 

资源

package com.gc.thread.producer;

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class Resource{

	private String name;//资源
	
	private int No;//资源编号
	
	boolean flag = false;//仓库是否有资源
	
	//唯一的锁
	Lock lock = new ReentrantLock();
	
	//分别为生产者与消费者各自独立分配一个监视器对象(这些监视器对象都绑定在同一把锁上)
	
	//1.通过锁获取生产者监视器对象
	Condition producerCon = lock.newCondition();
	
	//2.通过锁获取消费者监视器对象
	Condition consumerCon = lock.newCondition();
	
	
	/**
	 * 生产者
	 * @param name
	 * @throws InterruptedException 
	 */
	public synchronized void produce(String name) throws InterruptedException {
		lock.lock();
		try {
			while(flag) 
				producerCon.await();//调用生产者监视器对象的await(),让当前的生产者线程等待
			//为商品编号
			this.name = name + (++No);
			//生产1个商品
			System.out.println(Thread.currentThread().getName()+"--->生产:" + this.name);
			//更新标记
			this.flag = true;
			consumerCon.signal();//调用消费者监视器对象的signal(),唤醒处于等待状态的消费者线程
		} finally {
			lock.unlock();//释放锁
		}
		
	}
	
	/**
	 * 消费者
	 * @throws InterruptedException 
	 */
	public synchronized void consume() throws InterruptedException {
		lock.lock();
		try {
			while(!flag) 
				consumerCon.await();//调用消费者监视器对象的await(),让当前的消费者线程等待
			//消费1个商品
			System.out.println(Thread.currentThread().getName()+"------>消费:" + this.name);
			//更新标记
			this.flag = false;
			producerCon.signal();//调用生产者监视器对象的signal(),唤醒处于等待状态的生产者线程
		} finally {
			lock.unlock();//释放锁
		}
	}
	
}

 

生产者

package com.gc.thread.producer;

public class Producer implements Runnable {

	private Resource r;
	
	public Producer(Resource r) {
		this.r = r;
	}
	
	@Override
	public void run() {
		while(true)
			try {
				r.produce("goods");
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
	}

}

 

 

消费者

package com.gc.thread.producer;

public class Consumer implements Runnable {

	private Resource r;
	
	public Consumer(Resource r) {
		this.r = r;
	}
	
	@Override
	public void run() {
		while(true)
			try {
				r.consume();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
	}

}

 

 

开启线程

package com.gc.thread.producer;

public class Demo {
	public static void main(String[] args) {
		
		//资源
		Resource r = new Resource();
		
		//生产者
		Producer producer1 = new Producer(r);
		Producer producer2 = new Producer(r);
		
		//消费者
		Consumer consumer1 = new Consumer(r);
		Consumer consumer2 = new Consumer(r);
		
		new Thread(producer1).start();
		new Thread(producer2).start();
		new Thread(consumer1).start();
		new Thread(consumer2).start();
	}
}

 

分享到:
评论

相关推荐

    Java 5.0多线程编程

    在 Java 5.0 之前,多线程编程主要依赖于 `Thread` 类、`Runnable` 接口以及对象的 `wait()`、`notify()` 和 `notifyAll()` 方法来实现同步和通信,这些方法虽然能够满足基本需求,但在实际开发过程中存在着不少局限...

    Java API_5.0中文版

    8. **多线程(Multithreading)**:Java API提供了Thread类和Runnable接口来支持多线程编程,理解和掌握线程的同步、互斥、线程池等概念对于开发高并发应用程序至关重要。 9. **I/O流(Input/Output Streams)**:...

    达内JAVA TTS5.0 PDF----JAVA语言基础

    8. **多线程**:Java内置对多线程的支持,通过Thread类或实现Runnable接口来创建和管理线程,理解并发编程的概念,如同步、互斥、死锁和线程池等。 9. **接口与抽象类**:接口是完全抽象的,只包含方法签名,不包含...

    达内JAVA TTS5.0 PDF----JAVA SE核心2

    1. **多线程**:Java对多线程支持非常完善,学习者将深入理解线程的创建、同步、通信以及死锁问题。可能会讲解到Thread类和Runnable接口,synchronized关键字,wait()、notify()和notifyAll()方法,以及ThreadLocal...

    达内JAVA TTS5.0 PDF----JAVA SE核心1

    7. **多线程**:Java提供了内置支持进行多任务处理,通过Thread类和Runnable接口实现。这部分会讲解线程的创建、同步和通信方法。 8. **文件和文件系统**:学习如何操作文件和目录,包括创建、删除、移动和读写文件...

    J2SE 5.0- Java安全及网络计算的最新技术

    通过提供更高级别的抽象和更精细的控制选项,J2SE 5.0使得开发人员能够更容易地实现复杂的网络功能,如多线程网络服务器或高性能的客户端应用程序。 ### Beyond J2SE 5.0 尽管J2SE 5.0已经是一个巨大的飞跃,但...

    达内JAVA TTS5.0 PDF----Servlet

    除了基础概念,教程可能还会涵盖Servlet的多线程模型,因为每个Servlet实例默认是线程安全的,服务器会为每个请求分配一个新的线程,这意味着开发者需要注意同步问题以避免潜在的并发问题。此外,Servlet容器(如...

    mysql-connector-java-5.1.40-bin数据库连接工具.rar

    - 高性能:优化了查询执行速度,支持批量插入和多线程。 - SSL连接:提供安全的加密连接,确保数据传输的安全。 - 数据类型支持:全面支持MySQL的各种数据类型,包括BLOB、TEXT、DATE等。 - 预编译语句:使用...

    最新版jmeter-5.0

    3. **线程组**:线程组代表一组并发用户,可以设置线程数量、循环次数等参数,模拟多用户同时访问。 4. **采样器**:采样器用于执行HTTP请求、FTP请求、数据库请求等多种类型的测试。在JMeter 5.0中,HTTP采样器...

    Java多线程编辑核心技术

    除了上述核心概念和工具类,Java 5.0引入了并发工具类如CountDownLatch、CyclicBarrier、Semaphore等,它们为多线程编程提供了更细致的控制。比如,CountDownLatch允许一个或多个线程等待其他线程完成操作,...

    java多线程和锁,用于学习参考

    Java多线程与锁是Java并发编程中的核心概念,它们...综上所述,Java多线程和锁是解决并发问题的关键,它们涉及线程创建、管理、同步和通信等多个方面。通过深入学习和实践,开发者能够构建出更加稳定、高效的并发程序。

    Java多线程-多线程知识点总结和企业真题

    ### Java多线程知识点总结及企业真题解析 #### 一、知识点总结 ##### (1)多线程相关概念 1. **程序、进程和线程的区分**: - **程序**:为了完成特定的任务而编写的指令集合。它是静态的概念。 - **进程**:...

    java 多线程同步

    Java多线程同步是Java编程中关键的并发概念,它涉及到如何在多个线程访问共享资源时保持数据的一致性和完整性。`java.util.concurrent`包是Java提供的一个强大的并发工具库,它为开发者提供了多种线程安全的工具,...

    ACCP5.0-S1-阶段项目(代码)-MyQQ

    2. **多线程编程**:为了实现实时聊天,需要处理多个并发连接,因此多线程或多进程技术必不可少。 3. **用户界面设计**:使用GUI(图形用户界面)库,如Java的Swing或Qt,创建直观易用的聊天界面。 4. **数据序列化...

    Accp 5.0 Java

    6. **多线程**:Java提供了丰富的多线程支持,可以创建Thread对象或实现Runnable接口来实现并发执行。 7. **反射机制**:反射允许在运行时动态地获取类的信息并操作类的对象,是Java中一种强大的工具。 8. **JVM...

    Java多线程编程实战指南+设计模式篇(全部)

    在Java编程领域,多线程和设计模式是两个至关重要的概念。它们对于开发高效、可扩展和健壮的软件系统至关重要。本资源“Java多线程编程实战指南+设计模式篇(全部)”提供了全面的学习材料,帮助开发者深入理解并熟练...

    mysql-connector-java-5.1.18.rar

    6. **多线程处理**:能够有效地处理并发连接,适合多线程和高并发的Java应用。 7. **事务支持**:支持多种事务隔离级别,满足不同业务场景的需求。 8. **预编译语句和批处理**:提高执行效率,减少网络传输,降低SQL...

    Java面试宝典Beta5.0.zip

    4. **多线程** - **线程创建**:通过Thread类和Runnable接口创建线程。 - **线程同步**:synchronized关键字,wait/notify机制,以及Lock接口的使用。 - **线程池**:ExecutorService、ThreadPoolExecutor、...

    accp5.0java指导学习3

    6. **多线程**:Java支持多线程编程,通过Thread类和Runnable接口可以实现。理解线程的生命周期,掌握同步、互斥控制,以及线程池的使用,对于编写高效并发程序至关重要。 7. **反射机制**:Java的反射机制允许我们...

Global site tag (gtag.js) - Google Analytics