Java 多线程之龟兔赛跑(文件夹——读取文件——时间)
版权声明:本文为博主原创文章,未经博主允许不得转载。
描述:
乌龟和兔子(各自是一个Java线程)在我们的电脑上赛跑,我们为它们指定一个跑道(本地文件系统上的一个目录,该目录包含子目录)。跑的规则是读“跑道”上的所有文件。兔子很聪明,只读文件的元信息(路径名、大小、最后修改时间),但每读完一个文件就要睡1秒钟;乌龟很笨,读文件的每一个字节(乌龟每次读取数据的大小不超过1024字节),但是它不停歇地读,直到读完所有文件。写程序模拟它们同时起跑的比赛过程,最后输出“兔子赢!”或“乌龟赢!”
import java.io.File;
/**兔子线程
* 路径名 大小 最后修改时间 读完一个文件sleep。。
* @author gang
*
*/
public class Rabbit implements Runnable{
File file;
public Rabbit(){
file = null;
}
public Rabbit(File file){
this.file = file;
}
public void run(){
read(file);
}
public void read(File file){
if(file.isDirectory()){
for(File files:file.listFiles())
read(files);
} else {
file.getAbsolutePath();
file.lastModified();
file.length();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
package Thread;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
/**乌龟线程
* 每次读取不超过1024字节 一直读完整个文件夹
* @author gang
*
*/
public class Turtle implements Runnable{
File file;
public Turtle(){
file = null;
}
public Turtle(File file){
this.file=file;
}
public void run() {
// TODO Auto-generated method stub
try {
read(file);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void read(File file) throws IOException{
if(file.isDirectory()){
for(File files:file.listFiles())
read(files);
} else{
FileInputStream fiStream = new FileInputStream(file);
byte b[] = new byte[1024];
int i;
while((i = fiStream.read(b)) != -1);
}
}
}
package Thread;
import java.io.File;
import java.util.Scanner;
/**龟兔线程测试 输入相应的文件夹
*
* @author gang
*
*/
public class MainThread {
public static void main(String[] args){
String pathStr;
Scanner in = new Scanner(System.in);
pathStr = in.nextLine(); // input pathFile
File path = new File(pathStr); // path
Rabbit rabbit = new Rabbit(path);
Turtle turtle = new Turtle(path);
long t1Begin = System.currentTimeMillis(); //start
Thread t1 = new Thread(rabbit);
t1.start();
while(t1.isAlive());
long t1End = System.currentTimeMillis(); // t1 end
long t2Begin = System.currentTimeMillis(); //start
Thread t2 = new Thread(turtle);
t2.start();
while(t2.isAlive());
long t2End = System.currentTimeMillis(); // t2 end
// 测试结果
if((t1End-t1Begin) > (t2End-t2End)){
System.out.printf("time of Rabbit is %d ms.\n",(t1End-t1Begin));
System.out.printf("time of Turtle is %d ms.\n",(t2End-t2Begin));
System.out.println("Turtle win the game.");
} else if((t1End-t1Begin) < (t2End-t2End)){
System.out.printf("time of Rabbit is %d ms.\n",(t1End-t1Begin));
System.out.printf("time of Turtle is %d ms.\n",(t2End-t2Begin));
System.out.println("Rabbit win the game.");
} else{
System.out.printf("time of Rabbit is %d ms.\n",(t1End-t1Begin));
System.out.printf("time of Turtle is %d ms.\n",(t2End-t2Begin));
System.out.println("nobody win the game.");
}
}
}
代码解释见上注释。
输入相应测试的文件夹,即可开始测试,若文件项目多,则运行时间较长,请耐心等待。
Java 多线程之龟兔赛跑(文件夹——读取文件——时间)的更多相关文章
- android从asset文件夹读取文件
1)将一个txt文本(msg.txt)复制到开发目录的asset文件夹下. 2)用getAssets().open()可以得到一个输入流.注意getAssets方法必须用在Activity下边.如果不 ...
- HDFS 读取、写入、遍历文件夹获取文件全路径、append
版权声明:本文为博主原创文章,未经博主同意不得转载.安金龙 的博客. https://blog.csdn.net/smile0198/article/details/37573081 1.从HDFS中 ...
- Java删除文件夹和文件
转载自:http://blog.163.com/wu_huiqiang@126/blog/static/3718162320091022103144516/ 以前在javaeye看到过关于Java操作 ...
- 【转】Java删除文件夹和文件
原文网址:http://kxjhlele.iteye.com/blog/323657 以前在javaeye看到过关于Java操作文件的一篇文章,写的很好,但找了半天也没找到,就把找到底几篇文章整理一下 ...
- Android Studio的使用(十)--读取assets、Raw文件夹下文件,以及menu、drawable文件夹
1.直接在/src/main目录下面新建assets目录 2.接下来即可读取文件 3.读取Raw文件夹下文件也类似.首先在res文件夹下新建raw目录,然后放入需要的文件即可读取. 4.menu和dr ...
- php中读取中文文件夹及文件报错
php读取时出现中文乱码 一般php输出中出现中文乱码我们可用 header ('content:text/html;charset="utf-8"'); php中读取中文文件夹及 ...
- java 查询路径中所有文件夹和文件的名称,支持文件名模糊查询
java 查询路径中所有文件夹和文件的名称,支持文件名模糊查询 有时候我们遇到需要查询服务器或者本机某个路径下有哪些文件?或者根据文件名称模糊搜索文件,那么就可以使用本方法:可以获取某个路径下所有文件 ...
- Java访问文件夹中文件的递归遍历代码Demo
上代码: import java.io.File; /* * 需求:对指定目录进行所有内容的列出(包含子目录中的内容) * 也可以理解为 深度遍历. */ public class FindAllFi ...
- Java——如何创建文件夹及文件,删除文件,文件夹
package com.zz; import java.io.File; import java.io.IOException; /** * Java创建文件夹 */ public class Cre ...
随机推荐
- java:利用数组实现将古诗词纵向输出
java:利用二维数组实现将古诗词纵向输出. 从网络上随便搜索一首古诗词,这里刻意选择句子长短不一的诗词 1.首先先把诗词放进一个二维数组中. 这里将数组类型定义成char 类型,因为将其定义为S ...
- 【H5开发基础】移动端1像素边框问题的解决方案
自从乔帮主提出retina屏以来.可练就了不少前端兄弟的像素眼,有强迫症的伙伴们日子可就煎熬了.为了画出真正的1像素边框,前端猿们也是受尽各浏览器的虐待了. 关于什么是移动端1像素边框问题,先上两张图 ...
- UML的六种关系
UML定义的关系主要有:泛化.实现.依赖.关联.聚合.组合,这六种关系紧密程度依次加强,分别看一下 泛化 概念:泛化是一种一般与特殊.一般与具体之间关系的描述,具体描述建立在一般描述的基础之上,并对其 ...
- ceph主要数据结构解析3-Ceph_fs.h文件
(1)集群内部子版本协议类型宏定义:与公共协议保持独立性,以便消息类型和协议升级受影响 #define CEPH_OSDC_PROTOCOL 24 /* server/client */OSD服务 ...
- Cobar是提供关系型数据库(MySQL)分布式服务的中间件
简介 Cobar是提供关系型数据库(MySQL)分布式服务的中间件,它可以让传统的数据库得到良好的线性扩展,并看上去还是一个数据库,对应用保持透明. 产品在阿里巴巴稳定运行3年以上. 接管了3000+ ...
- hdu1074 Doing Homework(状态压缩DP Y=Y)
Doing Homework Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) T ...
- SHELL网络爬虫实例剖析--转载
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://nolinux.blog.51cto.com/4824967/1552472 前天 ...
- spring03autowire属性
1.创建需要的实体类 public class Student { //学生实体类 private String name; //姓名 private Integer age; //年龄 privat ...
- ASP.NET-FineUI开发实践-3
1.参照模拟数据库分页通过缓存重写内存分页,优化页面响应速度 Grid的响应速度是硬伤,我写了个通用方法把所有数据放在缓存中模拟数据库分页,比自带的缓存分页快很多,这里贴上实体类的通用方法,DataT ...
- Ecstore获取dbschema内容?
有时候在使用dbschema的时候,需要获取dbschema的结构.例如: 那么,我们可以这样写: 这样我就能获得 称呼 这个数组