多线程练习

写两个线程,其中一个线程打印1-52,另一个线程打印A-Z,打印顺序应该是12A34B56C......5152Z。

该习题需要用到多线程通信的知识。

思路分析:

把打印数字的线程称为线程N,打印字母的线程称为线程L.

1.线程N完成打印后,需要等待,通知线程L打印;同理,线程L打印后,也需要等待,并通知线程N打印

线程的通信可以利用Object的wait和notify方法。

2.两个线程在执行各自的打印方法的时候,不应该被打断,所以把打印方法设置成同步的方法。

3.两个线程何时停止打印?当两个线程的打印方法都执行了26次的时候。

 

实现:

1.PrintStr类,用来完成打印,拥有printNumber和printLetter两个同步方法

 1 package pratise.multithreading;
 2 
 3 public class      {
 4     
 5     private int flag=0;
 6     private int beginIndex=1;
 7     private int beginLetter=65;
 8     
 9     private int nCount=0;
10     private int lCount=0;
11     
12     public int getnCount()
13     {
14         return nCount;
15     }
16     
17     public int getlCount()
18     {
19         return lCount;
20     }
21     
22     public synchronized void printNumber() 
23     {
24         try {
25                 if(flag==0)
26                 {
27                     nCount++;
28                     System.out.print(beginIndex);
29                     System.out.print(beginIndex+1);
30                     beginIndex+=2;
31                     //改标志位
32                     flag++;
33                     //唤醒另一个线程
34                     notify();
35                 }else
36                 {
37                     wait();
38                 }
39         } catch (InterruptedException e) {
40             e.printStackTrace();
41         }
42     
43     }
44     
45     public synchronized void printLetter()
46     {
47         try {
48                 if(flag==1)
49                 {
50                     lCount++;
51                     char letter=(char)beginLetter;
52                     System.out.print(String.valueOf(letter));
53                     beginLetter++;
54                     flag--;
55                     notify();
56                 }else
57                 {
58                     wait();
59                     
60                 }
61         } catch (InterruptedException e) {
62             // TODO Auto-generated catch block
63             e.printStackTrace();
64         }
65         
66             
67     }
68 
69 }

 

2.两个线程类,分别包含一个PrintStr对象

 1     package pratise.multithreading;
 2     
 3     public class PrintNumberThread extends Thread {
 4         private PrintStr ps;
 5         public PrintNumberThread(PrintStr ps)
 6         {
 7             this.ps=ps;
 8         }
 9     
10         public void run()
11         {
12             
13             while(ps.getnCount()<26)
14             {
15                 ps.printNumber();
16             }
17         }
18     }
 1 package pratise.multithreading;
 2 
 3 public class PrintLetterThread extends Thread {
 4     private PrintStr ps;
 5     public PrintLetterThread(PrintStr ps)
 6     {
 7         this.ps=ps;
 8     }
 9 
10     public void run()
11     {
12         while(ps.getlCount()<26)
13         {
14             ps.printLetter();
15         }
16     }
17 }

 

3.含有main方法的类,用来启动线程。

 1 package pratise.multithreading;
 2 
 3 public class PrintTest {
 4 
 5     public static void main(String[] args) {
 6         PrintStr ps=new PrintStr();
 7         new PrintNumberThread(ps).start();
 8         new PrintLetterThread(ps).start();
 9     }
10 
11 }

 

posted @ 2019-08-10 22:31  沐一  阅读(463)  评论(0编辑  收藏  举报