学习接水系统(java+thread线程)
(一)项目框架分析
对于学生并发接水项目,根据面向对象的思想,需要创建两个对象,即学生和水龙头。
接下来主要讲解不排队接水和排队接水两张情况。
项目的目录文件如下:

(二)不排队接水
假设有四个学生小常、小尚、小王和小刘下课之后去接水。由于水房中只要一个水龙头,所以,谁先去,谁先接水,谁先回教室。
Water.java类用来模拟现实生活中的水龙头,水龙头具有流水的功能,所以该类中有一个流水的方法flowWater,具体代码如下:
package com.cjg.noqueue;
public class Water {
public void flowWater(String studentName){
System.out.println("开始为"+studentName+"流水");
try{
Thread.sleep(3000); //线程休眠
}
catch(InterruptedException e){
e.printStackTrace();
}
System.out.println("结束为"+studentName+"流水");
}
}
Student.java类用来模拟现实生活中的学生,由于学生要实现并发接水的功能,所以接水的代码全部放在run() 方法里,具体代码如下:
package com.cjg.noqueue;
public class Student extends Thread {
private String studentName;
private Water water;
public Student(String studentName ,Water water){
super();
this.studentName = studentName;
this.water=water;
}
public void receiveWater(){
System.out.println(studentName+"从教室跑向饮水机");
water.flowWater(studentName);
System.out.println(studentName+"跑回教师");
}
public void run(){
receiveWater();
}
}
TestWater.java类用来测试学生和水龙头的类,是否实现了不排队接水的功能,具体代码如下:
package com.cjg.noqueue;
public class TestWater {
public static void main(String[] args){
Water water =new Water();
Student xiaochang = new Student("小常",water);
Student xiaoshang=new Student("小尚",water);
Student xiaowang=new Student("小王",water);
Student xiaoliu=new Student("小刘",water);
xiaochang.start();
xiaoshang.start();
xiaowang.start();
xiaoliu.start();
}
}
程序运行结果
小常从教室跑向饮水机
小尚从教室跑向饮水机
小王从教室跑向饮水机
小刘从教室跑向饮水机
开始为小刘流水
开始为小王流水
开始为小尚流水
开始为小常流水
结束为小刘流水
结束为小常流水
结束为小王流水
小王跑回教师
结束为小尚流水
小尚跑回教师
小常跑回教师
小刘跑回教师
(三)排队接水
Water.java类的代码如下:
package com.cjg.queue;
public class Water {
int studentNumber;
public synchronized void flowWater(String studentName){
synchronized (this){
++studentNumber;
System.out.println("开始为"+studentName+"流水");
try{
Thread.sleep(3000); //线程休眠
}
catch(InterruptedException e){
e.printStackTrace();
}
System.out.println("结束为"+studentName+"流水");
if(studentNumber<4){
try{
wait();
}
catch(InterruptedException e){
e.printStackTrace();
}
}else{
notifyAll();
}
}
}
}
Student.java类的具体代码如下:
package com.cjg.queue;
import com.cjg.noqueue.Water;
public class Student extends Thread {
private String studentName;
private Water water;
public Student(String studentName ,Water water){
super();
this.studentName = studentName;
this.water=water;
}
public void receiveWater(){
System.out.println(studentName+"从教室跑向饮水机");
water.flowWater(studentName);
System.out.println(studentName+"跑回教师");
}
public void run(){
receiveWater();
}
}
Student.java类的代码和不排队接水的代码相同。
代码运行结果:
小常从教室跑向饮水机
小王从教室跑向饮水机
小尚从教室跑向饮水机
开始为小王流水
开始为小常流水
小刘从教室跑向饮水机
开始为小刘流水
开始为小尚流水
结束为小常流水
结束为小刘流水
小刘跑回教师
结束为小尚流水
结束为小王流水
小尚跑回教师
小常跑回教师
小王跑回教师
(四)java多线程thread
进程是程序在处理机中的一次运行。一个进程既包括其所要执行的指令,也包括了执行指令所需的系统资源,不同进程所占用的系统资源相对独立。所以进程是重量级的任务,它们之间的通信和转换都需要操作系统付出较大的开销。
线程是进程中的一个实体,是被系统独立调度和分派的基本单位。线程自己基本上不拥有系统资源,但它可以与同属一个进程的其他线程共享进程所拥有的全部资源。所以线程是轻量级的任务,它们之间的通信和转换只需要较小的系统开销。
Java支持多线程编程,因此用Java编写的应用程序可以同时执行多个任务。Java的多线程机制使用起来非常方便,用户只需关注程序细节的实现,而不用担心后台的多任务系统。
Java语言里,线程表现为线程类。Thread线程类封装了所有需要的线程操作控制。在设计程序时,必须很清晰地区分开线程对象和运行线程,可以将线程对象看作是运行线程的控制面板。在线程对象里有很多方法来控制一个线程是否运行,睡眠,挂起或停止。线程类是控制线程行为的唯一的手段。一旦一个Java程序启动后,就已经有一个线程在运行。可通过调用Thread.currentThread方法来查看当前运行的是哪一个线程。
JAVA中创建线程可以通过继承Thread类和实现Runnable接口来创建一个线程。
继承Thread类
class MyThread extends Thread{
.....
@Override
public void run(){
}
}
MyThread mt=new MyThread();
mt.start();
实现Runnable接口
class MyThread implements Runnable{
....
@Override
public void run(){
}
}
MyThread mt=new MyThread();
Thread td=new Thread(mt);
sd.start();
学习接水系统(java+thread线程)的更多相关文章
- Java Thread线程控制
一.线程和进程 进程是处于运行中的程序,具有一定的独立能力,进程是系统进行资源分配和调度的一个独立单位. 进程特征: A.独立性:进程是系统中独立存在的实体,可以拥有自己独立的资源,每个进程都拥有自己 ...
- Java Thread(线程)案例详解sleep和wait的区别
上次对Java Thread有了总体的概述与总结,当然大多都是理论上的,这次我将详解Thread中两个常用且容易疑惑的方法.并通过实例代码进行解疑... F区别 sleep()方法 sleep()使当 ...
- java thread 线程锁同步,锁,通信
12.线程同步 当多个线程访问同一个数据时,非常容易出现线程安全问题.这时候就需要用线程同步 Case:银行取钱问题,有以下步骤: A.用户输入账户.密码,系统判断是否登录成功 B.用户输入取款金额 ...
- java thread 线程40个问题汇总
http://www.codeceo.com/article/40-java-thread-problems.html 1.多线程有什么用? 一个可能在很多人看来很扯淡的一个问题:我会用多线程就好了, ...
- JAVA Thread线程异常监控
一.场景描述:单线程程序可以用try...catch捕获程序的异常,而在多线程程序的时候是无法使用try...catch捕获. 示例1:多线程发生异常,无法使用try...catch捕获问题 publ ...
- communication between threads 线程间通信 Programming Concurrent Activities 程序设计中的并发活动 Ada task 任务 Java thread 线程
Computer Science An Overview _J. Glenn Brookshear _11th Edition activation 激活 parallel processing 并行 ...
- Android(java)学习笔记62:继承Thread类创建线程类
package cn.itcast_02; /* * 该类要重写run()方法,为什么呢? * 不是类中的所有代码都需要被线程执行的. * 而这个时候,为了区分哪些代码能够被线程执行,java提供了T ...
- Android(java)学习笔记2:继承Thread类创建线程类
1. 继承Thread类 创建线程类: package cn.itcast_02; /* * 该类要重写run()方法,为什么呢? * 不是类中的所有代码都需要被线程执行的. * 而这个时候,为了区分 ...
- java: Thread 和 runnable线程类
java: Thread 和 runnable线程类 Java有2种实现线程的方法:Thread类,Runnable接口.(其实Thread本身就是Runnable的子类) Thread类,默认有ru ...
随机推荐
- selenium Chromediver
Here we use wget to fetch the version number of the latest release, then plug the version into anoth ...
- ZOJ 1011 - NTA
题目大意:有一颗完全二叉树,给节点一个信号会从一个表中选择一对信号分别传递给两个子节点.最后判断所有叶子节点是否满足给定的规则.题目有点长,具体可参见原题. 首先是表格中数据的存储,由于会有多个元素, ...
- AnsiIO
1.文件数据内容,元数据内容 i节点ls -l err.txt-rw-rw-r-- 1 csgec csgec 50 Jun 23 11:19 err.txt-:普通文件(文件类型)rw-:属主用户拥 ...
- 触摸滑动插件 Swiper
Swiper Swiper 是纯javascript打造的滑动特效插件,面向手机.平板电脑等移动终端. Swiper中文网里已有详细的使用介绍,我就不多做介绍了. http://www.swiper ...
- 【开源.NET】 分享一个前后端分离的轻量级内容管理框架
开发框架要考虑的面太多了:安全.稳定.性能.效率.扩展.整洁,还要经得起实践的考验,从零开发一个可用的框架,是很耗时费神的工作.网上很多开源的框架,为何还要自己开发?我是基于以下两点: 没找到合适的: ...
- 《JAVASCRIPT高级程序设计》创建对象的七种模式
细看javascript创建对象模式的诞生,具体的脉络为:不使用任何模式——工厂模式——构造函数模式——原型模式——组合使用构造函数模式——动态原型模式——寄生构造函数模式——稳妥构造函数模式.每一种 ...
- 工作总结之Git
工作中,终端数据的制作好后,使用的是SmartGit(注:Git的一个客户端)来push到服务器:但是出现了奇怪的现象: 1.git checkout到本地的目录,理论上目录下有包括新增,删除,变更在 ...
- Canvas + JavaScript 制作图片粒子效果
首先看一下源图和转换成粒子效果的对比图: 左侧图片为源图,右侧图片为粒子效果图.该效果是在Canvas画布上制作的.将图片制作成粒子效果相对而言是比较简单的.重点了解两个知识点即可 1:图 ...
- WPF DEV CellTemplateSelector(一个正确使用DevExpress CellTemplateSelector的Demo)
说明 我在项目中根据需求需要用到WPF Dev CellTemplateSelector时,遇到不少坑.曾一度想要放弃使用模板转换器,但又心有不甘,终于在不断努力下,达到了需求的要求.所以写下来和大家 ...
- ArcGIS快速制图插件介绍
ArcGIS快速制图插件介绍 By 李远祥 作品背景 <快速制图插件增强版>在原有的<快速制图插件>基础上,加入植被乱序填充.生成立体楼快.等高线增强显示.一键导出地图和数据. ...