`

一道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

分享到:
评论

相关推荐

    Java程序员面试题

    Java程序员在面试中可能会遇到各种各样的问题,涵盖了语言基础、类与对象、多线程、集合框架、异常处理、IO流、网络编程等多个方面。以下是对这些面试题的详细解析: 1. 题目涉及到字符串是不可变对象的概念。在`...

    Java最常见的面试题208道.docx

    以上只是部分内容,完整的208道面试题涵盖了更多深入的Java知识,包括设计模式、Spring框架、Mybatis、RabbitMQ、Kafka、Zookeeper、MySQL、Redis、JVM优化等方面,每一道题目都值得深入探讨和学习。

    Java题库(内含15套题)

    6. **多线程**:Java内置了对多线程的支持,允许程序同时执行多个任务。Thread类和Runnable接口是创建和管理线程的主要手段,同步机制(如synchronized关键字、Lock接口)确保了线程安全。 7. **反射**:Java反射...

    百家大公司java笔试题

    "100家大公司Java笔试题汇总.doc"这份文档提供了丰富的实践材料,建议考生们深入研究每一道题,不仅要找出正确答案,还要理解背后的原理,这样才能在真正的笔试中游刃有余,成功叩开心仪企业的门扉。同时,通过反复...

    开发面试题

    根据提供的文件信息,我们可以整理出一系列与开发相关的面试...这些问题涵盖了 Java 基础知识、面向对象编程、异常处理、多线程、Web 开发、框架应用等多个方面,对于准备 Java 开发岗位面试的求职者来说是非常有用的。

    java笔试题大集合及答案(另附各大公司笔试题)

    Java笔试题大集合是针对Java开发者进行技术面试和求职准备的重要资源,涵盖了广泛的知识点,旨在测试应聘者的编程基础、算法理解、数据结构、多线程、网络、数据库以及Java特性的掌握程度。这个大礼包通常包含不同...

    JAVA编程题全集(100题及答案).zip

    这100道编程题可能涵盖了Java的基础语法、面向对象编程、异常处理、集合框架、多线程、I/O流、网络编程、数据库操作、设计模式等多个方面。以下是一些可能涉及的知识点: 1. **基础语法**:包括变量声明、数据类型...

    Java大学实用教程课后答案

    《Java程序设计教程》通常会涵盖Java的基础语法、面向对象编程概念、异常处理、输入输出流、集合框架、多线程、网络编程等多个核心知识点。课后答案通常会按照章节结构,详细解析每一道习题,不仅给出正确的代码实现...

    分享一道java基础题,测测你是不是基础扎实

    题目未在描述或部分内容...以上只是Java基础知识的一部分,实际的Java面试题可能涉及这些概念的具体应用,例如内存管理、垃圾收集、并发控制、设计模式等。如果你遇到具体的Java题目,欢迎分享,我会尽我所能帮助解答。

    java-leetcode题解之第824题山羊拉丁文.zip

    在本压缩包“java-leetcode题解之第824题山羊拉丁文.zip”中,包含的是关于Java编程语言解决LeetCode算法题目的代码实现,特别是针对第824题“山羊拉丁文”(Goat Latin)的解答。LeetCode是一个在线平台,它提供了...

    华为面试题

    ### 华为面试题解析 #### Q1:OSI与TCP/IP模型的区别 - **OSI(开放式系统互联)模型**:由国际标准化组织(ISO)制定,它将网络通信的功能划分为7个层次,分别为物理层、数据链路层、网络层、传输层、会话层、...

    老虎集团笔试题JAVA-Cloudera-Certified-Hadoop-and-Spark-Developer-practice:代码完成

    【描述】:“老虎集团笔试题JAVA”说明了这道试题主要针对Java程序员,可能涵盖Java语言的基础语法、面向对象设计、多线程、集合框架等核心内容。同时,由于提到了Cloudera Certified Hadoop and Spark Developer,...

    java代码-新核云面试第2题

    最后,考虑到这是一道面试题,面试官可能还会关注代码的可读性、效率和最佳实践,比如是否合理地使用了注释、是否遵循了SOLID原则、是否优化了算法等。 综上所述,解答新核云面试的第二题,开发者需要具备扎实的...

    考试类精品--级西工大软件工程考研复试机试题,java实现.zip

    1. **Java基础**:包括语法、面向对象编程、异常处理、集合框架、IO流、多线程、网络编程等。 2. **数据结构与算法**:如链表、栈、队列、树、图、排序算法(冒泡、快速、归并、堆排序等)、查找算法(二分查找、...

    类实例化顺序讲解 附阿里巴巴一道笔试题

    类实例化顺序是Java编程中一个关键的概念,它涉及到类...了解类实例化顺序有助于理解和调试代码,尤其是在处理复杂的继承关系和多线程环境时。在实际开发中,应避免依赖特定的初始化顺序,以防止出现不可预测的行为。

    Cracking the Coding Interview PDF

    本书的题目以算法和数据结构为主,但也分别有一个章节涵盖分布式系统设计,c/c++、java、sql、多线程等知识性的内容。所有题目都有解答思路和答案,算法题目的实现使用了java。只要有一点java基础的同学,应该都可以...

    艾诺威笔试题

    笔试题通常涵盖编程基础、算法理解、操作系统原理、网络技术、数据库管理等多个方面,旨在评估候选人的综合素质。尽管题目可能具有一定的挑战性,但它们也为学习者提供了深入了解IT行业所需技能的机会。 首先,我们...

Global site tag (gtag.js) - Google Analytics