最近看到一道面试题,比较有意思:
有三个线程ID分别是A、B、C,请有多线编程实现,在屏幕上循环打印10次ABCABC…
由于线程执行的不确定性,要保证这样有序的输出,必须控制好多线程的同步。
线程同步有两种基本方法:
(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经典多线程面试题。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
2022java面试题、JVM面试题、多线程面试题、并发编程、Redis面试题、MySQL面试题、Java2022面试题、Netty面试题、Elasticsearch面试题、Tomcat面试题、Dubbo面试题、Kafka面试题、Linux面试题、2021面试题、java面试...
史上最全 Java 多线程面试题及答案.docx
java多线程面试经典,内含50道常被面试官问到的java多线程题。
15个顶级Java多线程面试题答案
Java多线程面试题,作为多线程面试题,非常经典。
Java多线程运行机制、并发处理面试题目深层解读。
C#面试题 包括 ADO.net 多线程等 C#面试题 包括 ADO.net 多线程等 C#面试题 包括 ADO.net 多线程等 C#面试题 包括 ADO.net 多线程等 C#面试题 包括 ADO.net 多线程等
Java 多线程面试题及答案
Java 多线程面试题.one
高级Java多线程面试题及回答
java面试题之多线程.pdf
java大厂的多线程面试题,涵盖了基础和进阶的多线程的理论和实际的应用,供各位下载使用。多线程面试题
多线程&并发面试题 JVM面试题 Mysql面试题 Redis面试题 Memcached面试题 MongoDB面试题 Spring面试题 Spring Boot面试题 Spring Cloud面试题 RabbitMQ面试题 Dubbo 面试题 MyBatis 面试题 ZooKeeper 面试题 数据结构...
iOS多线程面试题