写两个线程,一个线程打印 1~52,另一个线程打印字母A-Z。打印顺序为12A34B56C……5152Z。要求用线程间的通信

方法一

从其题目中得输出要求,我们发现字母A,B,C``` 的输出位置在整个序列中的位置是三的整数倍位置处,故在Printer类中定义的index是指在输出序列的索引。
package temp;
class Test
{
 public static void main(String[] args)
 {
  Printer p = new Printer(); //这两个对象共享对象p
 Thread t1 = new NumberPrinter(p);
  Thread t2 = new LetterPrinter(p);
  t1.start();
  t2.start();
 }
}
class Printer
{
 private int index = 1;// 设为1,方便计算3的倍数
 // 打印数字的构造方法,每打印两个数字,等待打印一个字母
 public synchronized void print(int i)
 {
  while (index % 3 == 0)
  {
   try
   {
    wait();
   }
   catch (Exception e)
   {
   }
  }
  System.out.print(" " + i);
  index++;
  notifyAll();
 }
 // 打印字母,每打印一个字母,等待打印两个数字
 public synchronized void print(char c)
 {
  while (index % 3 != 0)
  {
   try
   {
    wait();
   }
   catch (Exception e)
   {
   }
  }
  System.out.print(" " + c);
  index++;
  notifyAll();
 }
}
// 打印数字的线程
class NumberPrinter extends Thread
{
 private Printer p;
 public NumberPrinter(Printer p)
 {
  this.p = p;
 }
 public void run()
 {
  for (int i = 1; i <= 52; i++)
  {
   p.print(i);
  }
 }
}
// 打印字母的线程
class LetterPrinter extends Thread
{
 private Printer p;
 public LetterPrinter(Printer p)
 {
  this.p = p;
 }
 public void run()
 {
  for (char c = 'A'; c <= 'Z'; c++)
  {
   p.print(c);
  }
 }
}


方法二

public class ThreadDemo  
{  
    // 测试   
    public static void main(String[] args) throws Exception  
    {  
        Object obj = new Object();  
        // 启动两个线程   
        Thread1 t1 = new Thread1(obj);  
          
        Thread2 t2 = new Thread2(obj);  
          
        t1.start();  
        t2.start();  
    }  
      
}  
  
// 一个线程打印1-52   
class Thread1 extends Thread  
{  
    private Object obj;  
      
    public Thread1(Object obj)  
    {  
        this.obj = obj;  
    }  
      
    public void run()  
    {  
        synchronized (obj)  
        {  
            // 打印1-52   
            for (int i = 1; i < 53; i++)  
            {  
                System.out.print(i + " ");  
                if (i % 2 == 0)  
                {  
                    // 不能忘了 唤醒其它线程   
                    obj.notifyAll();  
                    try  
                    {  
                        obj.wait();  
                    }  
                    catch (InterruptedException e)  
                    {  
                        e.printStackTrace();  
                    }  
                }  
            }  
        }  
          
    }  
      
}  
  
// 另一个线程打印字母A-Z   
class Thread2 extends Thread  
{  
    private Object obj;  
      
    public Thread2(Object obj)  
    {  
        this.obj = obj;  
    }  
      
    public void run()  
    {  
        synchronized (obj)  
        {  
            // 打印A-Z   
            for (int i = 0; i < 26; i++)  
            {  
                System.out.print((char)('A' + i) + " ");  
                // 不能忘了 唤醒其它线程   
                obj.notifyAll();  
                try  
                {  
                    // 最后一个就不要等了   
                    if (i != 25)  
                    {  
                        obj.wait();  
                    }  
                }  
                catch (InterruptedException e)  
                {  
                    e.printStackTrace();  
                }  
                  
            }  
              
        }  
    }  
      
}  


 

  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值