多线程练习题目
使用多线程编程模拟多人通过一个隧道的情形。
假设隧道每次只允许一个人通过,每人通过隧道所需要的时间为5秒钟。随机产生5个人,同时准备通过隧道,依次显示出每次通过隧道的人的信息
/**
* 人类
*
* @author 小明
*
*/
public class Person extends Thread {
private static Object tunnel = new Object(); // 隧道对象
private String name; // 名称
public Person(String name) {
super();
this.name = name;
}
@Override
public void run() {
// 同步代码块,锁定隧道对象
synchronized (tunnel) {
System.out.println(this.name + " 准备过隧道");
System.out.println(this.name + " 正在过隧道...");
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(this.name + " 已通过隧道...");
}
}
}
因为每个人都需要单独通过隧道,隧道是被所有线程所共享的资源,我们应该使该对象在各线程中访问时互斥,所以使用同步代码块
测试
public class Test {
public static void main(String[] args) {
for(int i = 0; i < 5; i++){
new Person("tommy" + (i+1)).start();
}
}
}
结果
tommy1 准备过隧道
tommy1 正在过隧道...
tommy1 已通过隧道...
tommy5 准备过隧道
tommy5 正在过隧道...
tommy5 已通过隧道...
tommy4 准备过隧道
tommy4 正在过隧道...
tommy4 已通过隧道...
tommy3 准备过隧道
tommy3 正在过隧道...
tommy3 已通过隧道...
tommy2 准备过隧道
tommy2 正在过隧道...
tommy2 已通过隧道...
因线程执行的先后问题,可能结果不一致