版权声明:本文为博主原创文章,未经博主允许不得转载。

描述:

乌龟和兔子(各自是一个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 多线程之龟兔赛跑(文件夹——读取文件——时间)的更多相关文章

  1. android从asset文件夹读取文件

    1)将一个txt文本(msg.txt)复制到开发目录的asset文件夹下. 2)用getAssets().open()可以得到一个输入流.注意getAssets方法必须用在Activity下边.如果不 ...

  2. HDFS 读取、写入、遍历文件夹获取文件全路径、append

    版权声明:本文为博主原创文章,未经博主同意不得转载.安金龙 的博客. https://blog.csdn.net/smile0198/article/details/37573081 1.从HDFS中 ...

  3. Java删除文件夹和文件

    转载自:http://blog.163.com/wu_huiqiang@126/blog/static/3718162320091022103144516/ 以前在javaeye看到过关于Java操作 ...

  4. 【转】Java删除文件夹和文件

    原文网址:http://kxjhlele.iteye.com/blog/323657 以前在javaeye看到过关于Java操作文件的一篇文章,写的很好,但找了半天也没找到,就把找到底几篇文章整理一下 ...

  5. Android Studio的使用(十)--读取assets、Raw文件夹下文件,以及menu、drawable文件夹

    1.直接在/src/main目录下面新建assets目录 2.接下来即可读取文件 3.读取Raw文件夹下文件也类似.首先在res文件夹下新建raw目录,然后放入需要的文件即可读取. 4.menu和dr ...

  6. php中读取中文文件夹及文件报错

    php读取时出现中文乱码 一般php输出中出现中文乱码我们可用 header ('content:text/html;charset="utf-8"'); php中读取中文文件夹及 ...

  7. java 查询路径中所有文件夹和文件的名称,支持文件名模糊查询

    java 查询路径中所有文件夹和文件的名称,支持文件名模糊查询 有时候我们遇到需要查询服务器或者本机某个路径下有哪些文件?或者根据文件名称模糊搜索文件,那么就可以使用本方法:可以获取某个路径下所有文件 ...

  8. Java访问文件夹中文件的递归遍历代码Demo

    上代码: import java.io.File; /* * 需求:对指定目录进行所有内容的列出(包含子目录中的内容) * 也可以理解为 深度遍历. */ public class FindAllFi ...

  9. Java——如何创建文件夹及文件,删除文件,文件夹

    package com.zz; import java.io.File; import java.io.IOException; /** * Java创建文件夹 */ public class Cre ...

随机推荐

  1. 使用Cordova框架把Webapp封装成Hybrid App实践——Android篇

    公司没有IOS和没有安卓开发人员,前端后端都是需要自己玩前几天技术经理说有一个需求要把webapp封装成Hybrid App,现已完成.记录一下从中遇到的问题和需要用到的开发环境的配置 将Webapp ...

  2. jquery width(), innerWidth(), outerWidth() 区别

    #div1 { width: 100px; height: 100px; border: 5px black solid; padding: 10px; margin: 10px; backgroun ...

  3. <Win32_8>由浅入深——滚动条

    滚动条在Win32程序中是非常常见的一个控件,它的功能和地位也就不言而喻了,在文本输出中算是一个难点…… 我将借用P先生的思路讲述两种不同风格滚动条,下面切入主题:(实例程序都是显示一张位图  当然, ...

  4. CentOS 6.3下部署LVS(NAT)+keepalived实现高性能高可用负载均衡【转】

    CentOS 6.3下部署LVS(NAT)+keepalived实现高性能高可用负载均衡   一.简介 VS/NAT原理图: 二.系统环境 实验拓扑: 系统平台:CentOS 6.3 Kernel:2 ...

  5. CString与std::string unicode下相互转化

      1. CString to string CString str = L"test"; CString stra(str.GetBuffer(0)); str.ReleaseB ...

  6. eclipse 库 library jar包 工程 总结

    引用库错误 如果在libraries中发现有小红叉,表明引用库错误 解决办法:在左侧projects中add引用到的库 如:我们的支付库引用了以下三个库 那么需要在projects中add这三个库   ...

  7. 安装VS2013的离线MSDN帮助文档

    作为vs的初学者,安装帮助文档有利于快速掌握.net的基本语法,对于摸索学习的同学帮助很大. VS2013和VS2012的帮助文档目前为止还是一样 下面是下载地址    http://www.micr ...

  8. css元素居中

    水平居中 若为行内元素,对其父元素用text-align:center即可: 若为块元素(无浮动),则一般有两种方法可实现对其的水平居中,一为margin:0 auto;二为通过css计算函数calc ...

  9. ajax调用webservice(二) 跨域。

    所需工具与项目结构同(一). service.asmx中代码如下: using System; using System.Collections.Generic; using System.Web; ...

  10. ManagedPipelineHandler IIS

    IIS上部署MVC网站,打开后500错误:处理程序“ExtensionlessUrlHandler-Integrated-4.0”在其模块列表中有一个错误模块“ManagedPipelineHandl ...