经验不在于年限,在于积累---专注互联网软件开发

把工作当事业做,把项目当作品做!

  BlogJava :: 首页 :: 联系 :: 聚合  :: 管理
  55 Posts :: 0 Stories :: 66 Comments :: 0 Trackbacks

最近看到一道面试题,比较有意思:


有三个线程
ID分别是ABC,请有多线编程实现,在屏幕上循环打印10ABCABC…

由于线程执行的不确定性,要保证这样有序的输出,必须控制好多线程的同步。

线程同步有两种基本方法:

(1)    synchronized

(2)    wait,notify,notifyAll

现在分别采用这两种方法来解答这道题目。

/**

@author陈新汉 http://www.blogjava.net/hankchen

 * 2009-12-28 下午01:57:04

 */

/**

 *采用多线程技术打印10“ABC”,即ABCABC...”

 * 实现方式(一)利用synchronized关键字实现

 */

public class XunleiInterviewMultithread {

       /**

        * @param args

        */

       public static void main(String[] args) {

              XunleiLock lock = new XunleiLock();

              new Thread(new XunleiPrinter("A", lock)).start();

              new Thread(new XunleiPrinter("B", lock)).start();

              new Thread(new XunleiPrinter("C", lock)).start();

       }

}

class XunleiPrinter implements Runnable {

       private String name = "";

       private XunleiLock lock = null;

       private int count=10;

       public XunleiPrinter(String name, XunleiLock lock) {

              this.name = name;

              this.lock = lock;

       }

       @Override

       public void run() {

              while(count>0) {

                     synchronized (lock) {

                            if (lock.getName().equalsIgnoreCase(this.name)) {

                                   System.out.print(name);

                                   count--;

                                   if (this.name.equals("A")) {

                                          lock.setName("B");

                                   } elseif (this.name.equals("B")) {

                                          lock.setName("C");

                                   } elseif (this.name.equals("C")) {

                                          lock.setName("A");

                                   }

                            }

                     }

              }

       }

}

class XunleiLock

{

       public String name = "A";

       public String getName() {

              return name;

       }

       public void setName(String name) {

              this.name = name;

       }

}

方法(二)线程类修改如下,其他类一样:

class XunleiPrinter2 implements Runnable {

       private String name = "";

       private XunleiLock lock = null;

       private int count=10;

       public XunleiPrinter2(String name, XunleiLock lock) {

              this.name = name;

              this.lock = lock;

       }

       @Override

       public void run() {

              while(count>0) {

                     synchronized (lock) {

                            while(!lock.getName().equalsIgnoreCase(this.name)) {

                                   try{

                                          lock.wait();

                                   }catch(InterruptedException e){

                                          e.printStackTrace();

                                   }

                            }

                            System.out.print(name);

                            count--;

                            if (this.name.equals("A")) {

                                   lock.setName("B");

                            } elseif (this.name.equals("B")) {

                                   lock.setName("C");

                            } elseif (this.name.equals("C")) {

                                   lock.setName("A");

                            }

                            lock.notifyAll();

                     }

              }

       }

}

(友情提示:本博文章欢迎转载,但请注明出处:陈新汉,http://www.blogjava.net/hankchen
posted on 2009-12-29 20:58 hankchen 阅读(3679) 评论(0)  编辑  收藏 所属分类: Java基础

只有注册用户登录后才能发表评论。


网站导航: