`
i拾贝
  • 浏览: 29930 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

java测试线程同步synchronized,生产者消费者模型wait、notify、notifyAll

    博客分类:
  • java
阅读更多

java测试线程同步synchronized,生产者消费者模型wait、notify、notifyAll

 

java测试线程同步synchronized

TT.java

public class TT implements Runnable {
	int b = 100;
	
	public synchronized void m1() throws Exception{
		//Thread.sleep(2000);
		b = 1000;
		Thread.sleep(5000);
		System.out.println("b = " + b);
	}
	
	public synchronized void m2() throws Exception {
		Thread.sleep(2500);
		b = 2000;
	}
	
	public void run() {
		try {
			m1();
		} catch(Exception e) {
			e.printStackTrace();
		}
	}
	
	public static void main(String[] args) throws Exception {
		TT tt = new TT();
		Thread t = new Thread(tt);
		t.start();
		//t.sleep(500);
		tt.m2();
		System.out.println(tt.b);
	}
}

 

F:\java\Thread>javac TT.java

F:\java\Thread>java TT
1000
b = 1000

F:\java\Thread>

 

生产者消费者模型wait、notify、notifyAll

/*
	生产者消费者模型
*/
public class ProducerConsumer {
	public static void main(String[] args) {
		//一个篮子
		SyncStack ss = new SyncStack();
		//生产者
		Producer p = new Producer(ss);
		//消费者
		Consumer c = new Consumer(ss);
		new Thread(p).start();
		new Thread(c).start();
	}
}

//窝头
class WoTou {
	int id; 
	WoTou(int id) {
		this.id = id;
	}
	public String toString() {
		return "WoTou : " + id;
	}
}

//同步栈,先进后出
class SyncStack {
	int index = 0;
	//一个篮子放6个数组的窝头
	WoTou[] arrWT = new WoTou[6];
	
	//放
	public synchronized void push(WoTou wt) {
		while(index == arrWT.length) {
			try {
				this.wait();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		this.notifyAll();		
		arrWT[index] = wt;
		index ++;
	}
	
	//拿
	public synchronized WoTou pop() {
		while(index == 0) {
			try {
				this.wait();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		this.notifyAll();
		index--;
		return arrWT[index];
	}
}

//生产者
class Producer implements Runnable {
	SyncStack ss = null;
	Producer(SyncStack ss) {
		this.ss = ss;
	}
	
	public void run() {
		for(int i=0; i<20; i++) {
			WoTou wt = new WoTou(i);
			ss.push(wt);
	System.out.println("生产了:" + wt);
			try {
				Thread.sleep((int)(Math.random() * 200));
			} catch (InterruptedException e) {
				e.printStackTrace();
			}			
		}
	}
}

//消费者
class Consumer implements Runnable {
	SyncStack ss = null;
	Consumer(SyncStack ss) {
		this.ss = ss;
	}
	
	public void run() {
		for(int i=0; i<20; i++) {
			WoTou wt = ss.pop();
	System.out.println("消费了: " + wt);
			try {
				Thread.sleep((int)(Math.random() * 1000));
			} catch (InterruptedException e) {
				e.printStackTrace();
			}			
		}
	}
}

 

F:\java\Thread>javac ProducerConsumer.java

F:\java\Thread>java ProducerConsumer
生产了:WoTou : 0
消费了: WoTou : 0
生产了:WoTou : 1
生产了:WoTou : 2
生产了:WoTou : 3
生产了:WoTou : 4
生产了:WoTou : 5
生产了:WoTou : 6
消费了: WoTou : 6
生产了:WoTou : 7
消费了: WoTou : 7
生产了:WoTou : 8
消费了: WoTou : 8
生产了:WoTou : 9
消费了: WoTou : 9
生产了:WoTou : 10
消费了: WoTou : 10
生产了:WoTou : 11
消费了: WoTou : 11
生产了:WoTou : 12
消费了: WoTou : 12
生产了:WoTou : 13
消费了: WoTou : 13
生产了:WoTou : 14
消费了: WoTou : 14
生产了:WoTou : 15
生产了:WoTou : 16
消费了: WoTou : 15
消费了: WoTou : 16
生产了:WoTou : 17
生产了:WoTou : 18
消费了: WoTou : 17
消费了: WoTou : 18
生产了:WoTou : 19
消费了: WoTou : 19
消费了: WoTou : 5
消费了: WoTou : 4
消费了: WoTou : 3
消费了: WoTou : 2
消费了: WoTou : 1

F:\java\Thread>

 

 

分享到:
评论

相关推荐

    java多线程实现生产者和消费者

    9. **测试与调试**:多线程问题往往难以复现,因此在编写生产者-消费者代码时,应编写充分的测试用例,包括边界情况,如缓冲区满和空的状态转换。 通过理解和掌握这些知识点,开发者能够有效地实现生产者-消费者...

    JAVA实现线程间同步与互斥生产者消费者问题

    本项目通过一个生产者消费者问题的实例,展示了如何在Java中实现线程间的同步与互斥。 生产者消费者问题是经典的并发问题之一,它涉及到两个类型的线程:生产者和消费者。生产者负责生成数据(产品),而消费者则...

    Java 同步方式 wait和notify/notifyall

    下面是一个简单的生产者消费者模型示例,演示了`wait()`, `notify()` 的使用: ```java public class Buffer { private int data; private boolean available = false; public synchronized void put(int item)...

    Java多线程实现生产者消费者

    本示例中的“生产者-消费者”模型是一种经典的多线程问题,它模拟了实际生产环境中的资源分配与消耗过程。下面我们将详细探讨如何在Java中实现这个模型。 首先,我们要理解生产者-消费者模型的基本概念。在这个模型...

    java多线程实现生产者消费者关系

    在实际开发中,除了使用synchronized和wait/notify外,还可以利用Java并发库提供的高级工具,如`ExecutorService`,`CountDownLatch`,`CyclicBarrier`等,来更优雅地实现生产者消费者模型。例如,可以使用`...

    java 多线程生产者消费者模型demo

    Java多线程生产者消费者模型是一种典型的线程协作模式,用于解决并发编程中资源的高效利用和同步问题。在这个模型中,"生产者"线程负责生成数据,而"消费者"线程则负责处理这些数据。为了实现这种模式,Java提供了...

    java多线程(生产者与消费者)

    总结来说,“java多线程(生产者与消费者)”是关于如何在Java中使用同步、线程间通信和共享资源来实现高效且安全的并发编程。通过理解并熟练应用这些概念和工具,开发者可以构建出能够充分利用多核处理器能力的高...

    生产者消费者Java—synchronized 机制

    在Java编程中,生产者消费者模型是一种典型的多线程问题,用于解决资源的共享和并发控制。这个模型中,生产者负责生成数据,而消费者负责消耗这些数据。在这个项目中,开发者利用`synchronized`关键字来实现线程同步...

    java线程安全以及生产者消费者demo

    Java线程安全与生产者消费者模型是多线程编程中的两个重要概念,它们在并发处理中扮演着关键角色。在Java中,线程安全是指一个类或者方法在多线程环境下能够正确地处理数据,避免数据的不一致性或竞态条件。而生产者...

    Java 同步锁 wait notify 学习心得

    例如,在生产者-消费者模型中,生产者线程在向共享缓冲区添加元素时可能会调用`wait()`,直到有空闲空间可用。消费者线程在移除元素后会调用`notify()`或`notifyAll()`来唤醒一个或所有等待的生产者线程,告知它们...

    Java线程间的通信----生产者消费者模型

    生产者线程在生产完产品后调用`notify()`或`notifyAll()`唤醒消费者线程,消费者线程在消费完产品后调用`wait()`进入等待状态。 - `Semaphore`信号量:控制同时访问特定资源的线程数量。 - `CyclicBarrier`循环...

    java生产者消费者模型

    Java生产者消费者模型是多线程编程中一种经典的并发控制模型,它源于操作系统中的哲学思想,用于解决资源的共享和异步处理问题。在该模型中,"生产者"线程负责生成数据,而"消费者"线程则负责消费这些数据。两者之间...

    学习Java线程之并发协作生产者消费者模型.pdf

    Java线程中的并发协作模型是多线程编程中一个核心的概念,它主要通过生产者消费者模型来体现。在这个模型中,生产者线程负责创建或生产资源,而消费者线程则负责消耗这些资源。为了保证线程之间的协作和数据的一致性...

    java中生产者和消费者模型

    总的来说,Java中的生产者-消费者模型是通过线程同步机制实现的,主要涉及`synchronized`关键字和`wait()`, `notify()`, `notifyAll()`方法,以及各种缓冲区策略,如双缓冲区,来保证线程安全和高效的数据处理。...

    如何在Java中正确使用 wait, notify 和 notifyAll

    举个例子,如果你的Java程序中有两个线程——即生产者和消费者,那么生产者可以通知消费者,让消费者开始消耗数据,因为队列缓冲区中有内容待消费(不为空)。相应的,消费者可以通知生产者可以开始生成更多的数据,...

    java生产者消费者问题

    为了解决生产者和消费者之间的问题,Java提供了一系列的同步机制,如synchronized关键字、wait()、notify()和notifyAll()方法,以及高级的BlockingQueue接口。 首先,我们要理解生产者消费者模型的基本概念。在该...

    自己用Java写的简单生产者与消费者模型

    在Java中实现生产者-消费者模型时,通常会用到`java.lang.Thread`类或`java.util.concurrent.ExecutorService`接口来创建和管理线程,同时利用`synchronized`关键字、`wait()`、`notify()`或`notifyAll()`方法来实现...

    Java多线程-生产者与消费者问题

    ### Java多线程-生产者与消费者问题 #### 一、生产者与消费者问题概览 **1.1 概要** 生产者与消费者问题是计算机科学中一个多线程同步的经典问题。它描述了两个线程如何共享有限资源的场景:一个是生产者...

    Java多线程中wait、notify、notifyAll使用详解

    例如,在生产者-消费者模型中,生产者线程可以使用wait()方法等待消费者线程的唤醒,而消费者线程可以使用notify()或notifyAll()方法唤醒生产者线程。 wait、notify、notifyAll方法是Java多线程编程中非常重要的...

Global site tag (gtag.js) - Google Analytics