`

一道Java多线程面试题的解答

 
阅读更多


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


有三个线程
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

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics