(一)项目框架分析

对于学生并发接水项目,根据面向对象的思想,需要创建两个对象,即学生水龙头

接下来主要讲解不排队接水排队接水两张情况。

项目的目录文件如下:

(二)不排队接水

  假设有四个学生小常、小尚、小王和小刘下课之后去接水。由于水房中只要一个水龙头,所以,谁先去,谁先接水,谁先回教室。

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线程)的更多相关文章

  1. Java Thread线程控制

    一.线程和进程 进程是处于运行中的程序,具有一定的独立能力,进程是系统进行资源分配和调度的一个独立单位. 进程特征: A.独立性:进程是系统中独立存在的实体,可以拥有自己独立的资源,每个进程都拥有自己 ...

  2. Java Thread(线程)案例详解sleep和wait的区别

    上次对Java Thread有了总体的概述与总结,当然大多都是理论上的,这次我将详解Thread中两个常用且容易疑惑的方法.并通过实例代码进行解疑... F区别 sleep()方法 sleep()使当 ...

  3. java thread 线程锁同步,锁,通信

    12.线程同步 当多个线程访问同一个数据时,非常容易出现线程安全问题.这时候就需要用线程同步 Case:银行取钱问题,有以下步骤: A.用户输入账户.密码,系统判断是否登录成功 B.用户输入取款金额 ...

  4. java thread 线程40个问题汇总

    http://www.codeceo.com/article/40-java-thread-problems.html 1.多线程有什么用? 一个可能在很多人看来很扯淡的一个问题:我会用多线程就好了, ...

  5. JAVA Thread线程异常监控

    一.场景描述:单线程程序可以用try...catch捕获程序的异常,而在多线程程序的时候是无法使用try...catch捕获. 示例1:多线程发生异常,无法使用try...catch捕获问题 publ ...

  6. communication between threads 线程间通信 Programming Concurrent Activities 程序设计中的并发活动 Ada task 任务 Java thread 线程

    Computer Science An Overview _J. Glenn Brookshear _11th Edition activation 激活 parallel processing 并行 ...

  7. Android(java)学习笔记62:继承Thread类创建线程类

    package cn.itcast_02; /* * 该类要重写run()方法,为什么呢? * 不是类中的所有代码都需要被线程执行的. * 而这个时候,为了区分哪些代码能够被线程执行,java提供了T ...

  8. Android(java)学习笔记2:继承Thread类创建线程类

    1. 继承Thread类 创建线程类: package cn.itcast_02; /* * 该类要重写run()方法,为什么呢? * 不是类中的所有代码都需要被线程执行的. * 而这个时候,为了区分 ...

  9. java: Thread 和 runnable线程类

    java: Thread 和 runnable线程类 Java有2种实现线程的方法:Thread类,Runnable接口.(其实Thread本身就是Runnable的子类) Thread类,默认有ru ...

随机推荐

  1. pku2104

    传送门:http://poj.org/problem?id=2104 题目大意:给定一个长度为N的数组{A[i]},你的任务是解决Q个询问.每次询问在A[l], A[l+1], ...... , A[ ...

  2. 笔记整理——使用openssl编程

    error: openssl 的所有解决方案 (2013/6/22 17:39:00) error: openssl/crypto.h: No such file or directory 解决方案 ...

  3. 创业类网站建设日志1——搭建服务器svn以及前端开发环境

    1.需要在linux环境的服务器下搭建node和npm还有Grunt,所以先需要一个叫putty的工具连接服务器命令行终端 2.双击putty工具,在HostName一栏输入项目服务器地址:172.1 ...

  4. FarPoint Spread ChildView子视图

    有一种需求场景在很多地方都会用到,就是父子关系(头表和子表的关系),比如订单和订单明细. 做过winform的朋友第spread控件应该比较熟悉,或者了解.他的展示方式就通过一个关联关系就可以了,下面 ...

  5. 【MongoDb基础】插入数据

    以mydb为事例数据库. 切换到mydb数据库. use mydb 1. insert函数. db.users.insert({name:"Derek",age:18}) 该函数会 ...

  6. ThinkPHP框架开发的应用的标准执行流程

    用户URL请求 调用应用入口文件(通常是网站的index.php) 载入框架入口文件(ThinkPHP.php) 记录初始运行时间和内存开销 系统常量判断及定义 载入框架引导类(Think\Think ...

  7. HTTP Session学习

    session在web开发中是一个非常重要的概念,这个概念很抽象,很难定义,也是最让人迷惑的一个名词,也是最多被滥用的名字之一,在不同的场合,session一次的含义也很不相同.这里只探讨HTTP S ...

  8. pureMVC简单示例及其原理讲解四(Controller层)

    本节将讲述pureMVC示例中的Controller层. Controller层有以下文件组成: AddUserCommand.as DeleteUserCommand.as ModelPrepCom ...

  9. js动画(四)

    终于到了最后了,这里要告一段落了,整了个js运动框架,咳咳咳,好冷 啊啊啊啊啊啊,这天气.妈的,工资怎么也不发,啊,说好的 人与人之间的信任呢?哎,气诶,不到150字啊,又是这个梗..怎么办?说些什么 ...

  10. 《JAVASCRIPT高级程序设计》第一章

    在使用调制解调器的时代,频繁的表单验证对客户端来说是一个很大的负担,javascript,作为一种专门进行表单验证的客户端脚本语言诞生了.到今天,javascript早已超越了当初设定的角色.Java ...