(一)项目框架分析

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

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

项目的目录文件如下:

(二)不排队接水

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

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. begin lydsy 2731

    2731: 最长重复子串 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 6  Solved: 4[Submit][Status][Web Board] ...

  2. iOS 之 时间格式与字符串转换

    这个知识点涉及到三个类:NSDate.NSString,另外是一个最重要的类NSDateFormatter.它起到格式转换的作用,至于方法查看头文件就好了.时间格式注意下:yyyyMMddHHmmss

  3. Grunt插件之LiveReload 实现页面自动刷新,所见即所得编辑

    苦B的前端每次在制作和修改页面时,都有一个特定的三部曲:coding-save-F5.很多时候都希望自己一改东西,页面就能立刻显示,而现在LiveReload就能做到这点. LiveReload会监控 ...

  4. ThinkPHP创建应用的一般开发流程

    使用ThinkPHP创建应用的一般开发流程是: 系统设计.创建数据库和数据表:(可选) 项目命名并创建项目入口文件,开启调试模式: 完成项目配置: 创建项目函数库:(可选) 开发项目需要的扩展(模式. ...

  5. PHP导入导出Excel方法

    看到这篇文章的时候,很是惊讶原作者的耐心,虽然我们在平时用的也 有一些,但没有作者列出来的全,写excel的时候,我用过pear的库,也用过pack压包的头,同样那些利用smarty等作的简单替换xm ...

  6. java IMAGEIO

    javax.imageio使用 ImageIO 类的静态方法可以执行许多常见的图像 I/O 操作. 此包包含一些基本类和接口,有的用来描述图像文件内容(包括元数据和缩略图)(IIOImage): 有的 ...

  7. Intent的属性及Intent-filter配置——Extra属性——Flag属性

    Intent的Extra属性通常用于在多个Action之间进行数据交换,Intent的Extra属性值应该是一个Bundle对象,Bundle对象的就像一个Map对象,它可以存入多组key-value ...

  8. Servlet 获取IllegelStateException

    Servlet 获取IllegelStateException: response提交之后,进行requestDispatcher.forwar(),会产生这样的问题: 但是必须是outputStre ...

  9. HDU4403(暴搜)

    A very hard Aoshu problem Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & ...

  10. We Chall-Prime Factory-Writeup

    MarkdownPad Document html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,ab ...