A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 小丑的媳妇2 中级黑马   /  2013-3-6 12:26  /  2683 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

今看到一道面试题,题目要求如下:
写两个线程,一个线程打印 1~52,另一个线程打印字母A-Z。打印顺序为12A34B56C……5152Z。
要求用线程间的通信。

我的思想是分别给两个对象构造一个对象o,数字每打印两个或字母每打印一个就执行o.wait()。
但是具体怎么构造函数实在不怎么了解,懂的高手给说一下,最好能给出可以运行的程序,多谢!

评分

参与人数 1技术分 +1 收起 理由
洪建超 + 1

查看全部评分

6 个回复

倒序浏览
我做了一下,实现了,你看看是否可以
  1. package synchronous;
  2. /**
  3. * 写两个线程,一个线程打印 1~52,另一个线程打印字母A-Z。打印顺序为12A34B56C……5152Z。
  4. * 要求:用线程间的通信
  5. * 问题地址:http://bbs.itheima.com/thread-39962-1-1.html
  6. * @author joyce
  7. *
  8. */
  9. public class Solution130306 {

  10.         /**
  11.          * @param args
  12.          */
  13.         public static void main(String[] args) {
  14.                 // TODO Auto-generated method stub
  15.                 CriticalResources cr=new CriticalResources();
  16.                 (new PrintNumerical(cr)).start();
  17.                 (new PrintLetter(cr)).start();
  18.         }

  19. }
  20. class CriticalResources{
  21.         private int num=2;
  22.         private int letter=1;
  23.        
  24.         public void printNum(int i){
  25.                 while(num==0 && letter==1){
  26.                         try {
  27.                                 wait();
  28.                         } catch (InterruptedException e) {
  29.                                 // TODO Auto-generated catch block
  30.                                 e.printStackTrace();
  31.                         }
  32.                 }
  33.                 num--;
  34.                 System.out.print(i);
  35.                 if(num==0){
  36.                         letter=1;
  37.                         notify();
  38.                 }
  39.         }
  40.         public void printLetter(char ch){
  41.                 while(num!=0 && letter==0){
  42.                         try {
  43.                                 wait();
  44.                         } catch (InterruptedException e) {
  45.                                 // TODO Auto-generated catch block
  46.                                 e.printStackTrace();
  47.                         }
  48.                 }
  49.                 letter--;
  50.                 System.out.print(ch);
  51.                 if(letter==0){
  52.                         num=2;
  53.                         notify();
  54.                 }
  55.         }
  56. }
  57. class PrintNumerical extends Thread{
  58.         private CriticalResources cr;
  59.         PrintNumerical(CriticalResources cr){
  60.                 this.cr=cr;
  61.         }
  62.         @Override
  63.         public void run() {
  64.                 synchronized (cr) {
  65.                         for(int i=1; i<=52; i++){
  66.                                 cr.printNum(i);
  67.                         }
  68.                 }
  69.         }
  70.        
  71. }
  72. class PrintLetter extends Thread{
  73.         private CriticalResources cr;
  74.         PrintLetter(CriticalResources cr){
  75.                 this.cr=cr;
  76.         }
  77.         @Override
  78.         public void run() {
  79.                 synchronized (cr) {
  80.                         for(char ch='A'; ch<='Z'; ch++){
  81.                                 cr.printLetter(ch);
  82.                         }
  83.                 }
  84.         }
  85. }
复制代码
运行结果:
12A34B56C78D910E1112F1314G1516H1718I1920J2122K2324L2526M2728N2930O3132P3334Q3536R3738S3940T4142U4344V4546W4748X4950Y5152Z

评分

参与人数 1技术分 +1 收起 理由
洪建超 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 张晋瑜 于 2013-3-6 15:20 编辑

写得比较随意,没添加注释,要是有不懂的地方欢迎回帖
该题涉及知识:线程同步,要搞懂临界区、临界资源、临界值。这样做起来就比较快了
回复 使用道具 举报
张晋瑜 发表于 2013-3-6 15:14
我做了一下,实现了,你看看是否可以运行结果:
12A34B56C78D910E1112F1314G1516H1718I1920J2122K2324L2526 ...

我想知道  你的小程序 能够自然终止吗  我写的 同步里面 用for循环  当条件不满足时  run方法就该结束吧  那程序就能终止了  可我的不行  不知道为什么
回复 使用道具 举报
门文通 发表于 2013-3-7 00:59
我想知道  你的小程序 能够自然终止吗  我写的 同步里面 用for循环  当条件不满足时  run方法就该结束吧  ...

可以呀,你要贴出代码来看看哦
回复 使用道具 举报
张晋瑜 发表于 2013-3-7 13:32
可以呀,你要贴出代码来看看哦

下面这个程序怎么不能自然终止呢
http://bbs.itheima.com/thread-40051-1-1.html


我提问了一下  你看看
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马