利用线程间的通讯实现的水池加水放水

业务需求,加水速度5L/s,放水速度2L/s,加水时不能放水,放水时不能加水,水池容量500L

class Pool{

	int volume = 0;
	int maxVolume = 500;
	int waterInSpeed = 5;
	int waterOutSpeed = 2;
	boolean flag = false;

}

class WaterIn extends Thread{

	Pool pool = new Pool();

	int temp = 0;
	//构造器
	public WaterIn(Pool pool) {
		this.pool = pool;
	}
	@Override
	public void run(){
		while(true){
			synchronized (pool) {
			  if(!pool.flag){
				  try {
					  Thread.sleep(10);
				  } catch (InterruptedException e) {
					  // TODO Auto-generated catch block
					  e.printStackTrace();
				  }
				  if(pool.volume < pool.maxVolume){
					  pool.volume += pool.waterInSpeed;
					  if(temp++%10 == 0){
						  System.out.println("水池加水到:"+pool.volume);

					  }
				  }
				  else{
					  System.out.println("水已经满了"+pool.volume);
					  pool.flag = true;
					  pool.notify();
				  }
			    }else{
					try {
						pool.wait();
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}
			}
		}
	}
}
class WaterOut extends Thread{

	Pool pool = new Pool();
	int temp;
	//构造器
	public WaterOut(Pool pool) {
		this.pool = pool;
	}
	@Override
	public void run(){
		  while(true){
			  synchronized(pool){
				  //进行标识判断
				  if(pool.flag){
					  if(pool.volume>0){
						  pool.volume -=pool.waterOutSpeed;
						  if(temp++%20 == 0)
							  System.out.println("水已经放到"+pool.volume);

					  }else{
						  System.out.println("水已经放完了"+pool.volume);
						  pool.flag = false;
						  pool.notify();
					  }
				  }else{
					  try {
						pool.wait();
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				  }
			  }
		  }
	}

  

Pool pool =new Pool();
		WaterIn in =new WaterIn(pool);
		WaterOut out = new WaterOut(pool);
		in.start();
		out.start();

  

时间: 2024-08-27 14:09:05

利用线程间的通讯实现的水池加水放水的相关文章

线程间的通讯

直接上一个Demo,模拟生产者和消费者,就是生产了一个物品,然后消费一个物品,就这样你一下,我一下,让他们有类似有通讯的功能一样知道彼此生产了而且消费了.这里需要考虑两个问题面向这个demo时候,第一是线程的安全问题,第二是通讯问题,你一下,我一下 1 package com.thread; 2 // 定义一个共享的数据 3 class User { 4 public String name; 5 public String age; 6 boolean flag = true; // 稍后会用

黑马程序员——java——线程间的通讯 生产者与消费者

线程间的的通讯  生产者与消费者 public class TestDemos3 { public static void main(String[] args) { Res r = new Res(); Input in = new Input(r); Output out = new Output(r); Thread t1 = new Thread(in); Thread t2 = new Thread(out); t1.start(); t2.start(); } } class Res

进程和线程的关系及区别,进程间如何通讯,线程间如何通讯

1 定义 进程:进程是程序处理机上的一次执行过程, 它是一个动态的概念,它是系统进行资源分配和调度的一个独立单位. 线程:进程的一个实体,是CPU运行调度的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源. 2 关系 一个线程可以创建和撤销另一个线程:同一个进程中的多个线程之间可以并发执行: 相对进程而言,线程是一个更加接近于执行体的概念,它可

一个线程间的通讯小程序__(Java_Thread_Inout.Output)

1 //多线程通讯 2 //多个线程处理同一资源,但是任务不同 3 //等待唤醒方法: 4 //wait():将线程变成为冻结状态,线程会被存储在线程池中; 5 //notify():唤醒线程中的一个线程(任意的) 6 //notifyAll():唤醒所有线程; 7 /**************************************************************/ 8 //建立资源类 9 class Resource 10 { 11 private boolean

java多线程——线程间的通讯

public class ThreadDemo3 { public static void main(String[] args) { Resource res = new Resource(); Input input = new Input(res); Output output = new Output(res); Thread t1 = new Thread(input); Thread t2 = new Thread(output); t1.start(); t2.start(); }

iOS开发多线程-线程间通讯

一.NSThread 线程间的通讯 1 - (void)demoAboutNSThread 2 { 3 NSLog(@"demoAboutNSThread %@", [NSThread currentThread]); 4 NSThread * thread = [[NSThread alloc] initWithTarget:self selector:@selector(longTimeOperation) object:nil]; 5 [thread start]; 6 } 7

Java多线程之死锁与线程间通信简单案例

死锁定义 死锁是指两个或者多个线程被永久阻塞的一种局面,产生的前提是要有两个或两个以上的线程,并且来操作两个或者多个以上的共同资源:我的理解是用两个线程来举例,现有线程A和B同时操作两个共同资源a和b,A操作a的时候上锁LockA,继续执行的时候,A还需要LockB进行下面的操作,这个时候b资源在被B线程操作,刚好被上了锁LockB,假如此时线程B刚好释放了LockB则没有问题,但没有释放LockB锁的时候,线程A和B形成了对LockB锁资源的争夺,从而造成阻塞,形成死锁:具体其死锁代码如下:

多线程间的通讯之等待唤醒机制

线程间的通讯: 事实上就是多个线程在操作同一个资源. 可是操作动作不同 样例: 需求:模拟简单卖票系统(输入一个人.紧接着输出一个人) class Res { String name; String sex; } class Input implements Runnable { private Res r; private int t=0; Input(Res r) { this.r=r; } public void run() { while(true) { if(t==1) { r.nam

Linux进程间通信与线程间同步详解(全面详细)

引用:http://community.csdn.net/Expert/TopicView3.asp?id=4374496linux下进程间通信的几种主要手段简介: 1. 管道(Pipe)及有名管道(named pipe):管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信:   2. 信号(Signal):信号是比较复杂的通信方式,用于通知接受进程有某种事件发生,除了用于进程间通信外,进程还可以发送信号给进程本身