
版权声明:本文为博主原创文章,未经博主允许不得转载。
描述:
乌龟和兔子(各自是一个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."); } } }
代码解释见上注释。
输入相应测试的文件夹,即可开始测试,若文件项目多,则运行时间较长,请耐心等待。