(一)项目框架分析

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

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

项目的目录文件如下:

(二)不排队接水

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

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. python 数组的del ,remove,pop区别

    以a=[1,2,3] 为例,似乎使用del, remove, pop一个元素2 之后 a都是为 [1,3], 如下: >>> a=[1,2,3] >>> a.rem ...

  2. 深入理解SQL的四种连接

    SQL标准 select table1.column,table2.column from table1 [inner | left | right | full ] join table2 on t ...

  3. poi 导出excel 异常处理方式--曲线救国法

    excel 导出不算什么新鲜的话题.目前各种生成excel的开源jar包,poi,jxtl等.但是下载过程中如果出现异常该如何处理呢. 翻了之前的几个项目中的excel导出,有的异常就直接抛了出去,有 ...

  4. Angular - - angular.injector、angular.module

    angular.injector 创建一个injector对象, 调用injector对象的方法可用于获取服务以及依赖注入. 格式:angular.injector(modules); modules ...

  5. MySQL安装 MySQL5.7.10免安装版配置,mysql5.7.10免安装版

    MySQL5.7.10免安装版配置,mysql5.7.10免安装版  最新版的 Mysql 不提供图形界面的安装了, 下载下来是一个压缩包的形式, 那么我们如何来使用它呢, 让它为我们工作呢? 环境: ...

  6. zoom:1-hasLayout

    在现代浏览器,如果子元素float,则父元素不会自动被撑开 #nofloatbox { border: 1px solid #FF0000; background: #CCC; width:200px ...

  7. spring mvc 入门示例

    classpath <?xml version="1.0" encoding="UTF-8"?> <classpath> <cla ...

  8. CSS3-----图片翻页效果的展示

    在开发一个网站的过程中各种翻页效果数不胜数,在这里我将介绍一下简单的一种方法就是使用css3的旋转即可实现这种常见的效果: 显示效果如下: 首先是页面的布局,不用那么复杂; a标签的href属性,一般 ...

  9. android studio导入矢量svg图标技巧

    1.在android studio中打开File-->Settings-->Plugins,在Plugins中输入SVG2VectorDrawable搜索插件,并安装. 2.安装完成重启a ...

  10. Linux 菜鸟学习笔记--系统分区

    硬盘分区 常识 主分区:最多只能有4个 扩展分区:用于突破主分区最多4个的限制 *最多只能有1个 *主分区+扩展分区最多有4个 *不能写入数据,只能包含逻辑分区 逻辑分区 格式化:实际是写入文件系统, ...