zoukankan      html  css  js  c++  java
  • 多线程练习

    写两个线程,其中一个线程打印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 }
  • 相关阅读:
    FileSystemWatcher用法详解【转】
    关于TransactionScope事务的TransactionScopeOption的实例
    TransactionScope IsolationLevel 事务隔离级别
    C#中TransactionScope的使用方法和原理
    关于Qt 静态成员函数调用信号
    【Qt编程】基于QWT的曲线绘制及图例显示操作——有样点的实现功能
    使用qwt作曲线图——有网格线背景的画法
    Qt程序app添加图标复制到其它电脑后不显示的解决方法
    QUrl的使用,特别是对含特殊字符的字符串进行 URL 格式化编码
    QDateTime 本地时间和UTC时间转换问题
  • 原文地址:https://www.cnblogs.com/wsw-tcsygrwfqd/p/11333281.html
Copyright © 2011-2022 走看看