题目为:
有一个南北向的桥,只能容纳一个人,现桥的两边分别有10人和12人,编制一个多线程序让这些人到达对岸,每个人用一个线程表示,桥为共享资源。在过桥的过程中显示谁在过桥及其走向
论坛链接:http://www.iteye.com/topic/1041415
解法如下:
桥是共享资源,采用单例
public enum Direction {
North2Sourth{
String getInfo(){
return "北向南走";
}
},
Sourth2North{
String getInfo(){
return "南向北走";
}
};
abstract String getInfo();
}
public class Person implements Runnable {
/**
* 方向
*/
private Direction direction;
/**
* 姓名*标志
*/
private String name;
/**
* 持有一个桥的引用
*/
private static final Bridge BRIDGE=Bridge.getIntance();
public Direction getDirection() {
return direction;
}
public void setDirection(Direction direction) {
this.direction = direction;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void run() {
BRIDGE.display(this);
}
}
public class Bridge {
private static class BridgeContainer{
private static Bridge intance=new Bridge();
}
private Bridge(){
}
public synchronized void display(Person p) {
DateFormat df = new SimpleDateFormat("HH:mm:ss");
String date = df.format(System.currentTimeMillis());
System.out.println("时间:" + date+"过桥人为" +p.getName()+"方向是:"+ p.getDirection().getInfo() );
try {
/**
* 模拟过桥过程
*/
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static Bridge getIntance(){
return BridgeContainer.intance;
}
}
public class Client {
public static void main(String[] args) {
/**
* 模拟在南边的12个
*/
Person[] p1s=new Person[12];
for(int i=0;i<12;i++){
p1s[i]=new Person();
p1s[i].setName("n"+i+"号");
p1s[i].setDirection(Direction.North2Sourth);
new Thread(p1s[i]).start();
}
/**
* 模拟在北边的10个
*/
Person[] p2s=new Person[10];
for(int i=0;i<10;i++){
p2s[i]=new Person();
p2s[i].setName("s"+i+"号");
p2s[i].setDirection(Direction.Sourth2North);
new Thread(p2s[i]).start();
}
}
}
运行结果如下:
时间:13:09:21过桥人为n0号方向是:北向南走
时间:13:09:23过桥人为s9号方向是:南向北走
时间:13:09:25过桥人为s8号方向是:南向北走
时间:13:09:27过桥人为s7号方向是:南向北走
时间:13:09:29过桥人为s5号方向是:南向北走
时间:13:09:31过桥人为s6号方向是:南向北走
时间:13:09:33过桥人为s4号方向是:南向北走
时间:13:09:35过桥人为n10号方向是:北向南走
时间:13:09:37过桥人为s0号方向是:南向北走
时间:13:09:39过桥人为n11号方向是:北向南走
时间:13:09:41过桥人为s2号方向是:南向北走
时间:13:09:43过桥人为s3号方向是:南向北走
时间:13:09:45过桥人为n8号方向是:北向南走
时间:13:09:47过桥人为n6号方向是:北向南走
时间:13:09:49过桥人为n9号方向是:北向南走
时间:13:09:51过桥人为n2号方向是:北向南走
时间:13:09:53过桥人为s1号方向是:南向北走
时间:13:09:55过桥人为n4号方向是:北向南走
时间:13:09:57过桥人为n7号方向是:北向南走
时间:13:09:59过桥人为n5号方向是:北向南走
时间:13:10:01过桥人为n1号方向是:北向南走
时间:13:10:03过桥人为n3号方向是:北向南走
分享到:
相关推荐
Java编写的多线程C/S客户端考试系统是一个典型的分布式应用程序,它将客户端(Client)与服务器端(Server)分开,实现高效、稳定的考试服务。在这个系统中,Java语言以其跨平台性和丰富的类库成为了开发首选。下面...
6. **多线程**:Thread类和Runnable接口的使用,同步机制如synchronized关键字、wait/notify方法等,都是多线程编程的重要知识点。 7. **泛型**:泛型用于创建类型安全的集合,限制元素类型,提升代码可读性和复用...
10. 线程与并发:Java提供了多线程支持,可以同时执行多个任务。理解线程的生命周期、同步机制(synchronized, volatile, Lock)以及并发工具类(ExecutorService, ThreadPoolExecutor)是编写高性能Java应用的基础...
首先,我们可以预期这50道题目会覆盖基础语法、面向对象编程、集合框架、多线程、异常处理、IO流、网络编程、反射、枚举、注解等Java核心内容。基础语法包括变量、数据类型、运算符、流程控制语句等;面向对象则涉及...
Java是一种高级、基于对象的编程语言,它具有跨平台、面向对象、分布式、多线程等特点。Java基础编程题是Java编程的基础知识点的总结,涵盖了Java语言的基本语法、数据类型、运算符、控制结构、函数、数组、面向...
6. **多线程**:Java内置了对多线程的支持,允许程序同时执行多个任务。Thread类和Runnable接口是创建和管理线程的主要手段,同步机制(如synchronized关键字、Lock接口)确保了线程安全。 7. **反射**:Java反射...
标题中的“答复: 一道经典线程面试题的4种解法”暗示了这是一个关于多线程编程的问题,通常在面试中出现,用于评估候选人的并发处理能力。在这个问题中,可能涉及到同步、线程安全、锁机制等关键概念。 在Java中,...
下面将详细解析每一道题目涉及的关键概念。 ### 第一部分:基础知识 #### 1. final, finally, finalize的区别 - **final**: 用于声明变量、方法或者类,表示不可变性。例如,声明为final的变量不允许再次赋值;...
这可能是2009年的Java自考模拟试题集,它可能会包括选择题、填空题、简答题以及编程题等多种题型,覆盖了Java的基础语法、面向对象编程、异常处理、集合框架、多线程、IO流、网络编程以及JVM的工作原理等多个方面的...
5. Java多态性是Java语言中的一种重要概念,包括方法的重载和重写。面试官可能会问到重载和重写的区别、方法的重载和重写的应用场景等。 Java线程编程 6. Java线程编程是Java语言中的一种高级主题,包括线程的创建...
阿里软件JAVA笔试题是阿里巴巴公司为招聘软件开发工程师所设计的一份笔试题目,涵盖了JAVA语言、数据结构、算法、设计模式、数据库等多方面的知识点。 本题目共有15道题目,涵盖了以下几个方面: 逻辑推理 1. 甲...
6. **多线程**:Java支持多线程编程,考生需要理解线程的创建、同步和通信,如synchronized关键字、wait()、notify()和notifyAll()方法,以及Thread类和Runnable接口的区别。 7. **反射**:反射是Java的一个高级...
《Java程序设计》机考卷A.doc包含了若干道精心设计的Java编程题目,这些题目覆盖了Java语言的基础语法、面向对象编程、异常处理、集合框架、多线程、IO流、网络编程等多个核心领域。考生在解答这些题目时,不仅能...
12. **多线程**:创建线程的两种方式(继承Thread类和实现Runnable接口),理解线程同步(synchronized关键字,wait()、notify()和notifyAll()方法)和线程间通信。 13. **枚举类型**:了解枚举的创建和使用,以及...
7. **多线程**:了解线程的创建、同步、通信等,包括Thread类、Runnable接口,以及synchronized、wait()、notify()等关键字的应用。 8. **枚举与注解**:枚举用于定义一组固定的常量,注解则是为代码元素添加元数据...
6. **多线程**:Java内置了对多线程的支持,习题可能包括线程的创建、同步、通信等。理解线程间的协作与竞争对于开发高效的并发程序至关重要。 7. **网络编程**:Java提供了丰富的网络编程API,如Socket、...
- 多线程:理解线程的概念,如何创建和管理线程,以及同步和互斥的概念。 - 输入输出流:学习FileInputStream、FileOutputStream、BufferedReader、BufferedWriter等类,进行文件读写操作。 - 枚举和注解:了解...
volatile:volatile变量表示保证它必须是与主内存保持一致,它实际是""变量的同步"", 也就是说对于volatile变量的操作是原子型的,如用在long 或 double变量前,一般用于多线程编程。 abstract:抽象,必须重载,修饰...
8. 多态:学习多态性在Java中的表现,包括方法的重写和重载,以及接口的使用。 9. 异常处理:理解try-catch-finally结构,学习如何抛出和捕获异常,以及自定义异常的创建。 10. 集合框架:熟悉ArrayList、...