`
liaokang.java
  • 浏览: 155460 次
  • 性别: Icon_minigender_1
  • 来自: 湖南
社区版块
存档分类
最新评论

java线程通信

    博客分类:
  • java
阅读更多
一说到线程通信我们就会想到生产者和消费者,哲学家就餐问题,下面例子是以生产者与消费者来实现线程之间的通信
package com.lamp.test;

public class Cake {
	private int number = 0;
	
	public synchronized void increase(){
		while(0 != number){		//如果只有一个生产者进程和一个消费者进程,我们还可以用if来判断,但是涉及到2个以上进程就需用while来判断了这也是实践中用的最多的
			try {
				this.wait();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		number++;				//假定资源的数量只能为0或者1,为0时加1并唤醒消费者进程,消费者进程相反
		System.out.println(number);
		this.notify();
	}
	
	public synchronized void decrease(){
		while(0 == number){
			try {
				this.wait();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		number--;
		System.out.println(number);
		this.notify();
	}
}


生产者进程类
package com.lamp.test;

public class Producer extends Thread {

	private Cake cake;

	public Producer(Cake cake) {
		this.cake = cake;
	}

	@Override
	public void run() {
		for (int i = 0; i < 10; i++) {
			try {
				Thread.sleep((long) (Math.random() * 1000));
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			this.cake.increase();
		}

	}
}


消费者进程类
package com.lamp.test;

public class Consumer extends Thread{
	private Cake cake = null;

	public Consumer(Cake cake) {
		this.cake = cake;
	}
	
	@Override
	public void run(){
		for(int i=0; i<10; i++){
			try {
				Thread.sleep((long) (Math.random() * 1000));
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			this.cake.decrease();
		}
		
	}

}


写个测试类
package com.lamp.test;

public class CakeTest {

	public static void main(String[] args) {
		Cake cake = new Cake();
		
		Thread t1 = new Producer(cake);
		Thread t2 = new Consumer(cake);		//确保访问的是同一资源
		
		Thread t3 = new Producer(cake);
		Thread t4 = new Consumer(cake);
		
		t1.start();
		t2.start();
		t3.start();
		t4.start();
	}

}

wait与notify方法都是定义在Object方法中,而且是final的,因此会被所有的java类继承但是不能重写,这两个方法的调用必须在synchronized方法或者synchronized块中,而且当前线程要已经拿到了对象锁,当线程执行wait方法时,它会释放对象锁
分享到:
评论

相关推荐

    Java 线程通信示例 源代码

    这个"Java线程通信示例源代码"很可能包含了演示如何在不同线程之间共享数据和协调执行顺序的实例。线程通信主要涉及两个核心概念:同步和互斥。 1. **线程同步**:线程同步是为了防止多个线程同时访问共享资源,...

    java线程通信课程设计

    Java线程通信是多线程编程中的一个重要概念,它涉及到如何在并发执行的线程间交换信息或协调工作。在Java中,线程通信主要通过共享内存和消息传递两种方式来实现。本课程设计旨在深入理解和实践Java线程通信机制,以...

    深入理解java线程通信

    深入理解 Java 线程通信 Java 线程通信是 Java 编程中一个非常重要的概念,它可以使得多个线程之间能够相互通信和协作,从而实现更加复杂的任务。下面我们将深入理解 Java 线程通信的机制和实现方式。 一、等待...

    JAVA 线程通信相关知识汇总

    JAVA 线程通信相关知识汇总 JAVA 线程通信是指在 JAVA 多线程环境下,多个线程之间的协作和交互,以达到共同完成任务的目标。JAVA 线程通信相关知识汇总主要介绍了 JAVA 线程通信相关知识,文中讲解非常细致,代码...

    Java 线程通信示例源代码

    本源代码是博客《Java 多线程编程之六:线程之间的通信(附源代码)》附带的实例性源代码。原博客链接地址:http://blog.csdn.net/defonds/archive/2010/01/26/5257301.aspx。

    深入理解Java 线程通信

    "深入理解Java 线程通信" Java 线程通信是指在 Java 编程语言中,多个线程之间如何进行交流和协作的机制。Java 提供了多种机制来实现线程间的通信,包括使用 wait()、notify() 和 notifyAll() 方法,使用同步锁和 ...

    Java线程间的通信方式详解

    本文将详细介绍两种常见的Java线程通信方式:同步和while轮询。 1. 同步(Synchronized) 同步是Java中控制线程并发的一种手段,它通过`synchronized`关键字实现。在Java中,同步主要有两种形式:同步方法(通过在...

    线程通信安全问题

    总的来说,Java线程通信安全问题主要涉及如何有效地管理共享资源,确保线程间的协作无误。通过wait()、notify()和notifyAll()方法,我们可以实现复杂的线程同步策略,解决并发编程中的诸多挑战。在实际开发中,应...

    java 线程通信(算法)

    关于java 中的多线程,很多初学者为之头疼,看了一些书后,编了几个小程序,发布到这,希望有用!

    java多线程通信图解

    java 多线程 其实就是每个线程都拥有自己的内存空间,多线程之间的通信,比例A线程修改了主内存(main方法的线程)变量,需要把A线程修改的结果同步到主线程中,这时B线程再从主线程获取该变量的值,这样就实现了...

    Java线程技术精选

    条件变量是Java线程通信的一种机制,用于在特定条件满足时唤醒或等待线程。它们常与同步块一起使用,使得线程能够在等待特定事件发生时释放锁,从而避免不必要的阻塞。 2. **原子量**: 原子量(Atomic Variables...

    java 多线程-线程通信实例讲解

    在Java中,线程通信主要依赖于共享内存和内置的等待/通知机制。 首先,线程通过共享对象通信是一种常见的策略。例如,一个线程(线程A)可能负责生产数据,而另一个线程(线程B)则负责处理这些数据。线程A可以通过...

    JAVA多线程通信学习_服务器多线程通信_

    在Java编程中,多线程通信是构建高效并发应用程序的关键技术。服务器多线程通信尤其重要,因为它允许服务器同时处理多个客户端请求,提高系统资源利用率并优化响应时间。本篇文章将深入探讨Java中的多线程通信,以及...

    java tcp多线程通信

    Java TCP多线程通信是网络编程中的一个重要概念,它结合了Java的Socket编程与多线程技术,使得多个客户端能够同时与服务器进行交互。在Java中,TCP(传输控制协议)提供了一种可靠的数据传输方式,确保数据的有序、...

    Java多线程通信机制研究.pdf

    "Java多线程通信机制研究" Java多线程通信机制是Java程序设计中的一个复杂技术,涉及到多个线程之间的通信和协作。多线程是一种程序运行机制,它允许在程序中并发执行多个指令流,每个指令流都被称为一个线程,彼此...

    java线程.pdf

    Java线程间通信主要包括线程间的同步和线程间的协作两部分。常用的通信方法有`wait()`、`notify()`和`notifyAll()`等。 1. **wait()**:使当前线程暂停执行,并释放当前持有的锁。 2. **notify()**:唤醒正在等待该...

    Java线程使用教程

    2. **线程通信**:`wait()`, `notify()` 和 `notifyAll()` 方法用于线程间的通信,它们必须在`synchronized`代码块或方法中使用。 3. **线程优先级**:Java线程有10个优先级,通过`setPriority()`设置,但实际调度...

    java线程实例 各种小Demo

    五、线程通信 Java提供了wait()、notify()和notifyAll()方法进行线程间的通信,但这需要在同步控制块(synchronized)中使用。Java 5引入了BlockingQueue阻塞队列,提供了一种更安全的线程间通信方式,如...

Global site tag (gtag.js) - Google Analytics