版權聲明:本文為博主原創文章,未經博主允許不得轉載。描述:烏龜和兔子(各自是一個Java線程)在我們的電腦上賽跑,我們為它們指定一個跑道(本地文件系統上的一個目錄,該目錄包含子目錄)。跑的規則是讀“跑道”上的所有文件。兔子很聰明,只讀文件的元信息(路徑名、大小、最後修改時間),但每讀完一個文件就要睡...
版權聲明:本文為博主原創文章,未經博主允許不得轉載。
描述:
烏龜和兔子(各自是一個Java線程)在我們的電腦上賽跑,我們為它們指定一個跑道(本地文件系統上的一個目錄,該目錄包含子目錄)。跑的規則是讀“跑道”上的所有文件。兔子很聰明,只讀文件的元信息(路徑名、大小、最後修改時間),但每讀完一個文件就要睡1秒鐘;烏龜很笨,讀文件的每一個位元組(烏龜每次讀取數據的大小不超過1024位元組),但是它不停歇地讀,直到讀完所有文件。寫程式模擬它們同時起跑的比賽過程,最後輸出“兔子贏!”或“烏龜贏!”
1 import java.io.File; 2 3 /**兔子線程 4 * 路徑名 大小 最後修改時間 讀完一個文件sleep。。 5 * @author gang 6 * 7 */ 8 public class Rabbit implements Runnable{ 9 File file; 10 public Rabbit(){ 11 file = null; 12 } 13 public Rabbit(File file){ 14 this.file = file; 15 } 16 public void run(){ 17 read(file); 18 } 19 20 public void read(File file){ 21 if(file.isDirectory()){ 22 for(File files:file.listFiles()) 23 read(files); 24 } else { 25 file.getAbsolutePath(); 26 file.lastModified(); 27 file.length(); 28 try { 29 Thread.sleep(1000); 30 } catch (InterruptedException e) { 31 // TODO Auto-generated catch block 32 e.printStackTrace(); 33 } 34 } 35 } 36 }
1 package Thread; 2 3 import java.io.File; 4 import java.io.FileInputStream; 5 import java.io.FileNotFoundException; 6 import java.io.IOException; 7 8 /**烏龜線程 9 * 每次讀取不超過1024位元組 一直讀完整個文件夾 10 * @author gang 11 * 12 */ 13 public class Turtle implements Runnable{ 14 File file; 15 public Turtle(){ 16 file = null; 17 } 18 public Turtle(File file){ 19 this.file=file; 20 } 21 public void run() { 22 // TODO Auto-generated method stub 23 try { 24 read(file); 25 } catch (IOException e) { 26 // TODO Auto-generated catch block 27 e.printStackTrace(); 28 } 29 } 30 31 public void read(File file) throws IOException{ 32 if(file.isDirectory()){ 33 for(File files:file.listFiles()) 34 read(files); 35 } else{ 36 FileInputStream fiStream = new FileInputStream(file); 37 byte b[] = new byte[1024]; 38 int i; 39 while((i = fiStream.read(b)) != -1); 40 } 41 } 42 }
1 package Thread; 2 3 import java.io.File; 4 import java.util.Scanner; 5 6 /**龜兔線程測試 輸入相應的文件夾 7 * 8 * @author gang 9 * 10 */ 11 public class MainThread { 12 public static void main(String[] args){ 13 String pathStr; 14 Scanner in = new Scanner(System.in); 15 pathStr = in.nextLine(); // input pathFile 16 File path = new File(pathStr); // path 17 18 Rabbit rabbit = new Rabbit(path); 19 Turtle turtle = new Turtle(path); 20 21 long t1Begin = System.currentTimeMillis(); //start 22 Thread t1 = new Thread(rabbit); 23 t1.start(); 24 while(t1.isAlive()); 25 long t1End = System.currentTimeMillis(); // t1 end 26 27 long t2Begin = System.currentTimeMillis(); //start 28 Thread t2 = new Thread(turtle); 29 t2.start(); 30 while(t2.isAlive()); 31 long t2End = System.currentTimeMillis(); // t2 end 32 33 // 測試結果 34 if((t1End-t1Begin) > (t2End-t2End)){ 35 System.out.printf("time of Rabbit is %d ms.\n",(t1End-t1Begin)); 36 System.out.printf("time of Turtle is %d ms.\n",(t2End-t2Begin)); 37 System.out.println("Turtle win the game."); 38 } else if((t1End-t1Begin) < (t2End-t2End)){ 39 System.out.printf("time of Rabbit is %d ms.\n",(t1End-t1Begin)); 40 System.out.printf("time of Turtle is %d ms.\n",(t2End-t2Begin)); 41 System.out.println("Rabbit win the game."); 42 } else{ 43 System.out.printf("time of Rabbit is %d ms.\n",(t1End-t1Begin)); 44 System.out.printf("time of Turtle is %d ms.\n",(t2End-t2Begin)); 45 System.out.println("nobody win the game."); 46 } 47 } 48 }
代碼解釋見上註釋。
輸入相應測試的文件夾,即可開始測試,若文件項目多,則運行時間較長,請耐心等待。