1.使用多線程,模擬龜兔賽跑的場景。
線程類:
1 //模擬龜兔百米賽跑 2 3 public class ThreadTest1 extends Thread{ 4 5 @Override 6 public void run() { 7 try { 8 pao(); 9 } catch (InterruptedException e) { 10 e.printStackTrace(); 11 } 12 } 13 14 private static void pao() throws InterruptedException { 15 for(int i=1;i<=10;i++) { 16 System.out.println(Thread.currentThread().getName()+"打卡:"+i+"米"); 17 Thread.sleep(1000); 18 } 19 } 20 21 }
測試類:
1 public class ThreadTest2 { 2 3 public static void main(String[] args) { 4 Thread th1=new ThreadTest1(); 5 Thread th2=new ThreadTest1(); 6 7 th1.setName("龜"); 8 th2.setName("兔"); 9 10 th1.start(); 11 th2.start(); 12 } 13 }
測試結果:
兔打卡:1米
龜打卡:1米
龜打卡:2米
兔打卡:2米
龜打卡:3米
兔打卡:3米
兔打卡:4米
龜打卡:4米
龜打卡:5米
兔打卡:5米
兔打卡:6米
龜打卡:6米
龜打卡:7米
兔打卡:7米
龜打卡:8米
兔打卡:8米
兔打卡:9米
龜打卡:9米
兔打卡:10米
龜打卡:10米
2、編寫一個有兩個線程的程序,第一個線程用來計算2~100000之間的素數的個數,第二個線程用來計算100000~200000之間的素數的個數,最后輸出結果。
第一個線程類:
1 //線程類,以及判斷素數的方法 2 public class ThreadTest3 implements Runnable { 3 4 @Override 5 public void run() { 6 int a=fun1(); 7 System.out.println("一素數個數:"+a); 8 } 9 10 private static int fun1() { 11 12 int sum = 0;// 素數個數 13 14 for (int i = 2; i <= 100000; i++) {// 某個數 15 int j=2; 16 while(i%j!=0) { 17 j++; 18 } 19 if(j==i) { 20 sum++; 21 } 22 23 } 24 25 return sum; 26 } 27 28 }
第二個線程類:
1 public class ThreadTest5 implements Runnable{ 2 3 @Override 4 public void run() { 5 int a=fun2(); 6 System.out.println("二素數個數:"+a); 7 } 8 9 private static int fun2() { 10 11 int sum = 0;// 素數個數 12 13 for (int i = 100000; i <= 200000; i++) {// 某個數 14 int j=2; 15 while(i%j!=0) { 16 j++; 17 } 18 if(j==i) { 19 sum++; 20 } 21 22 } 23 24 return sum; 25 } 26 27 }
測試:
1 public class ThreadTest4 { 2 public static void main(String[] args) { 3 ThreadTest3 th=new ThreadTest3(); 4 Thread th1=new Thread(th); 5 th1.start(); 6 7 ThreadTest5 th2=new ThreadTest5(); 8 Thread th3=new Thread(th2); 9 th3.start(); 10 } 11 12 }
結果:
一素數個數:9592 二素數個數:8392
3、使用多線程實現多個文件同步復制功能,並在控制台顯示復制的進度,進度以百分比表示。例如:把文件A復制到E盤某文件夾下,在控制台上顯示“XXX文件已復制10%”,“XXX文件已復制20%”……“XXX文件已復制100%”,“XXX復制完成!”
//重點:java.text.DecimalFormat的使用(格式化十進制數)
1 package two; 2 3 import java.io.File; 4 import java.io.FileInputStream; 5 import java.io.FileOutputStream; 6 import java.text.DecimalFormat; 7 8 public class CopyFile extends Thread{ 9 10 public File older;//源文件路徑 11 public File newer;//目標文件路徑 12 13 //構造函數把路徑封裝成文件 14 public CopyFile(String older, String newer) { 15 this.older = new File(older); 16 this.newer = new File(newer); 17 } 18 19 @Override 20 public void run() { 21 FileInputStream fis=null; 22 FileOutputStream fos=null; 23 24 try { 25 fis=new FileInputStream(older); 26 fos=new FileOutputStream(newer); 27 28 long len=older.length();//獲取源文件的長度 跟 fis.available()的結果 29 30 31 //文件大小的十分之一 32 byte[] b=new byte[(int) (older.length()/10)];//聲明一個字節數組,每次讀取的數據存到這里 33 int length=0;//返回每次讀取的數據長度 34 35 36 System.out.println(len); 37 double temp=0; 38 39 DecimalFormat df=new DecimalFormat("##%"); 40 41 //最多將b.length個字節讀入一個byte數組中,也就是每次讀1/10個字節,然后循環,直到讀到問價尾 42 while((length = fis.read(b)) !=-1) {//讀到文件尾會返回-1 43 fos.write(b, 0, length);//把每次讀取的內容,輸出到目標路徑文件中 44 temp +=length;//把每次讀取的數據長度累加 45 double d=temp/len;//計算出已經讀取的長度占文件總長度的比率 46 47 int jd=(int) d; 48 if(jd%10==0) { 49 System.out.println(older.getName()+"文件復制了:"+df.format(d));//將小數給格式化 50 } 51 System.out.println(older.getName()+"文件已復制了:"+d); 52 } 53 System.out.println(older.getName()+"復制完畢!"); 54 55 } catch (Exception e) { 56 e.printStackTrace(); 57 }finally { 58 try { 59 fis.close(); 60 fos.close(); 61 } catch (Exception e2) { 62 e2.printStackTrace(); 63 } 64 } 65 } 66 }
測試:
1 package two; 2 3 public class CopyTest { 4 5 public static void main(String[] args) { 6 //兩個線程實例 7 CopyFile cf1=new CopyFile("G://金泰妍.MP3", "F://金泰妍.MP3"); 8 CopyFile cf2=new CopyFile("G://GD.MP3", "F://GD.MP3"); 9 cf1.start(); 10 cf2.start(); 11 } 12 }
結果:
3378348//輸出的是文件的大小 3817572 GD.MP3文件復制了:10% GD.MP3文件已復制了:0.09999976319787067 金泰妍.MP3文件復制了:10% 金泰妍.MP3文件已復制了:0.09999994761068029 GD.MP3文件復制了:20% GD.MP3文件已復制了:0.19999952639574134 金泰妍.MP3文件復制了:20% 金泰妍.MP3文件已復制了:0.19999989522136058 GD.MP3文件復制了:30% GD.MP3文件已復制了:0.29999928959361205 金泰妍.MP3文件復制了:30% 金泰妍.MP3文件已復制了:0.2999998428320409 GD.MP3文件復制了:40% GD.MP3文件已復制了:0.3999990527914827 金泰妍.MP3文件復制了:40% 金泰妍.MP3文件已復制了:0.39999979044272116 GD.MP3文件復制了:50% GD.MP3文件已復制了:0.49999881598935336 金泰妍.MP3文件復制了:50% 金泰妍.MP3文件已復制了:0.4999997380534015 GD.MP3文件復制了:60% GD.MP3文件已復制了:0.5999985791872241 金泰妍.MP3文件復制了:60% 金泰妍.MP3文件已復制了:0.5999996856640818 GD.MP3文件復制了:70% 金泰妍.MP3文件復制了:70% GD.MP3文件已復制了:0.6999983423850947 金泰妍.MP3文件已復制了:0.6999996332747621 GD.MP3文件復制了:80% GD.MP3文件已復制了:0.7999981055829654 金泰妍.MP3文件復制了:80% 金泰妍.MP3文件已復制了:0.7999995808854423 GD.MP3文件復制了:90% GD.MP3文件已復制了:0.8999978687808361 金泰妍.MP3文件復制了:90% 金泰妍.MP3文件已復制了:0.8999995284961226 GD.MP3文件復制了:100% GD.MP3文件已復制了:0.9999976319787067 GD.MP3文件已復制了:1.0 GD.MP3復制完畢! 金泰妍.MP3文件復制了:100% 金泰妍.MP3文件已復制了:0.999999476106803 金泰妍.MP3文件已復制了:1.0 金泰妍.MP3復制完畢!
4、設計4個線程,其中兩個線程每次對j增加1,另外兩個線程對j每次減少1。考慮到線程的安全性寫出程序。
1 package test.one; 2 3 //4、設計4個線程,其中兩個線程每次對j增加1,另外兩個線程對j每次減少1。考慮到線程的安全性寫出程序。 4 //使線程同步 5 public class Test1 {//一個主線程 6 7 private int j;//變量j 8 9 public static void main(String[] args) { 10 Test1 t=new Test1(); 11 Add add=t.new Add();//內部類的實例 12 Sub sub=t.new Sub(); 13 14 for(int i=0;i<2;i++){//循環兩邊創建四個線程,兩加兩減 15 Thread t1=new Thread(add); 16 t1.start(); 17 Thread t2=new Thread(sub); 18 t2.start(); 19 } 20 21 22 } 23 24 //考慮線程安全的問題,為方法加synchronized關鍵字,保證一時間只有一個線程操作該方法 25 private synchronized void add(){ 26 j++; 27 System.out.println(Thread.currentThread().getName()+":"+j); 28 } 29 30 private synchronized void sub(){ 31 j--; 32 System.out.println(Thread.currentThread().getName()+":"+j); 33 } 34 35 class Add implements Runnable{//線程,成員內部類無條件訪問外部類的所有成員 36 37 //線程調用了j+的方法 38 @Override 39 public void run() { 40 for (int i=0;i<10;i++){ 41 add(); 42 } 43 } 44 } 45 46 class Sub implements Runnable{//線程,同上 47 48 //線程調用了j-的方法 49 @Override 50 public void run() { 51 for (int i=0;i<10;i++){ 52 sub(); 53 } 54 } 55 } 56 }
測試結果(不唯一):
"C:\Program Files\Java\jdk1.8.0_151\bin\java.exe" "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 2018.3.4\lib\idea_rt.jar=64983:C:\Program Files\JetBrains\IntelliJ IDEA 2018.3.4\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_151\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_151\jre\lib\rt.jar;G:\IDEA-JAVA-Test\out\production\one" test.one.Test1 Thread-0:1 Thread-1:0 Thread-1:-1 Thread-1:-2 Thread-1:-3 Thread-1:-4 Thread-1:-5 Thread-1:-6 Thread-1:-7 Thread-1:-8 Thread-1:-9 Thread-0:-8 Thread-0:-7 Thread-0:-6 Thread-0:-5 Thread-0:-4 Thread-0:-3 Thread-0:-2 Thread-0:-1 Thread-0:0 Thread-2:1 Thread-2:2 Thread-2:3 Thread-2:4 Thread-2:5 Thread-2:6 Thread-2:7 Thread-2:8 Thread-2:9 Thread-2:10 Thread-3:9 Thread-3:8 Thread-3:7 Thread-3:6 Thread-3:5 Thread-3:4 Thread-3:3 Thread-3:2 Thread-3:1 Thread-3:0