多線程練習題


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

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM