java中用线程解决进出水问题

//进水
class Inflow implements Runnable{

	//水对象
	Water wat;
	public Inflow(Water w){
		this.wat = w;
	}

	@Override
	public void run() {
		//进水
		while (true) {
			synchronized (wat) {
				while (true) {
					if (wat.count >= 50) {
						wat.notify();
						try {
							wat.wait();
						} catch (InterruptedException e) {
							e.printStackTrace();
						}
					}
					try {
						//睡眠线程
						Thread.sleep(1000);
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
					wat.count++;
					System.out.println("现在是在进水,水量为:" + wat.count);
				}
			}

		}
	}
}

//出水
class Outflow implements Runnable{

	Water wat;
	public Outflow(Water w){
		this.wat = w;
	}

	@Override
	public void run() {
		//出水
		while (true) {
			//线程锁
			synchronized (wat) {
				while (true) {
					if (wat.count <= 0) {
						wat.notify();
						try {
							wat.wait();
						} catch (InterruptedException e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
						}
					}
					try {
						Thread.sleep(1000);
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
					wat.count--;
					System.out.println("现在是在放水,剩余水量为:" + wat.count);
				}
			}

		}
	}
}
class Water{

	int count = 50;

}
public class demo5 {

	public static void main(String[] args) {
		//创建水对象
		Water Water = new Water();
		//进水对象
		Inflow in = new Inflow(Water);
		//放水对象
		Outflow out = new Outflow(Water);

		//
		Thread thread = new Thread(in);
		Thread the = new Thread(out);

		//开启线程
		thread.start();
		the.start();
	}

}

  

时间: 2024-10-06 20:35:10

java中用线程解决进出水问题的相关文章

java线程学生进实训室

Instructor: Dr. Simina FlutureCSCI 34 CSCI 34 CSCI 34CSCI 34 0 Summer 201 ummer 201 ummer 201ummer 201ummer 201 4Project 1 – Due Date: Friday, Aug. 1stThrough its implementation, this project will familiarize you with the creation and execution of th

Java中线程(Thread)知识概括

Java中线程(Thread)知识概括 进程:是一个正在执行中的程序.每一个进程执行都有一个执行顺序.该顺序是一个执行路径,或者叫一个控制单元. 线程:就是进程中的一个独立的控制单元.线程在控制着进程的执行. 一个进程中至少有一个线程. 例如:Java VM 启动的时候会有一个进程java.exe.该进程中至少一个线程负责java程序的执行,而且这个线程运行的代码存在于main方法中.该线程称之为主线程.jvm启动不止一个线程,还有负责垃圾回收机制等线程. 如何在自定义的代码中,自定义一个线程呢

Java同步—线程锁和条件对象

线程锁和条件对象 在大多数多线程应用中,都是两个及以上线程需要共享对同一数据的存取,所以有可能出现两个线程同时访问同一个资源的情况,这种情况叫做:竞争条件. 在Java中为了解决并发的数据访问问题,一般使用锁这个概念来解决. 有几种机制防止代码收到并发访问的干扰: 1.synchronized关键字(自动创建一个锁及相关的条件) 2.ReentrantLock类+Java.util.concurrent包中的lock接口(在Java5.0的时候引入) ReentrantLock的使用 publi

阿里P7分享最新java面试——线程面试题集合

1.说说进程,线程,协程之间的区别 简而言之,进程是程序运行和资源分配的基本单位,一个程序至少有一个进程,一个进程至少有一个线程.进程在执行过程中拥有独立的内存单元,而多个线程共享内存资源,减少切换次数,从而效率更高.线程是进程的一个实体,是cpu调度和分派的基本单位,是比程序更小的能独立运行的基本单位.同一进程中的多个线程之间可以并发执行. 2.你了解守护线程吗?它和非守护线程有什么区别 程序运行完毕,jvm会等待非守护线程完成后关闭,但是jvm不会等待守护线程.守护线程最典型的例子就是GC线

深入理解Java之线程池

原作者:海子 出处:http://www.cnblogs.com/dolphin0520/ 本文归作者海子和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利. 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为频繁创建线程和销毁线程需要时间. 那么有没有一种办法使得线程可

Java中用正则表达式找出数字

Java中用正则表达式找出数字 1.题目    String str = "fjd789klsd908434jk#$$%%^38488545",从中找出78990843438488545,请找到解决办法 2.实现源码 /** * */ package com.you.model; /** * @author YouHaidong * */ public class FindNumber { /** * 字符串str */ public static String str = "

Java之线程,常用方法,线程同步,死锁

1, 线程的概念 进程与线程 进程:每个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销,一个进程包含1--n个线程.(进程是资源分配的最小单位) 线程:同一类线程共享代码和数据空间,每个线程有独立的运行栈和程序计数器(PC),线程切换开销小.(线程是cpu调度的最小单位) 切换而不是同步 一个程序中的方法有几条执行路径, 就有几个线程 Java中线程的生命周期 Java线程具有五中基本状态 新建状态(New):当线程对象对创建后,即进入了新建状态,如:Thread t =

Java的线程安全

线程安全 我们这里讨论的线程安全,就限定于多个线程之间存在共享数据访问这个前提,因为如果一段代码根本不会与其他线程共享数据,那么从线程安全的角度来看,程序是串行执行还是多线程执行对它来说是完全没有区别的. 共享的数据 可以将Java语言中各种操作共享的数据分为以下5类:不可变.绝对线程安全.相对线程安全.线程兼容和线程对立. 不可变 不可变(Immutable)的对象一定是线程安全的,无论是对象的方法实现还是方法的调用者,都不需要再采取任何的线程安全保障措施,final关键字带来的可见性,只要一

Java高新技术—线程池的使用

一. 问题引入 我们知道可以用1.继承Thread类 2.实现runnable接口两种方法创建一个线程,这样实现起来很方便,但是同样出现了一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率, 因为频繁创建线程和销毁线程需要时间. 那么有没有一种办法使得线程可以复用,就是执行完一个任务,并不被销毁,而是可以继续执行其他的任务? 在Java中可以通过线程池来达到这样的效果! 二. 线程池简介 ① Jdk1.5之后加入了java.