多线程练习
2019-08-16 12:18:29来源:博客园 阅读 ()
多线程练习
写两个线程,其中一个线程打印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 }
原文链接:https://www.cnblogs.com/wsw-tcsygrwfqd/p/11333281.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- 最详细的java多线程教程来了 2020-06-08
- 系统化学习多线程(一) 2020-06-08
- 多线程:生产者消费者(管程法、信号灯法) 2020-06-01
- JavaGUI练习 - 正交测试用例生成小工具 2020-05-31
- 如何合理地估算线程池大小? 2020-05-31
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash