编写多线程应用程序,模拟多个人通过一个山洞。
这个山洞每次只能通过一个人,每个人通过山洞的时间为5秒,随机生成10个人,同时准备过此山洞,显示一下每次通过山洞人的姓名。
思路:这里随机生成10个人,就好比是10个线程,并发的执行,它们竞争这个山洞的通过权,同时,每个人通过山洞的时间是5s。但是这里随机的意思,不知道是通过的顺序有随机性,还是生成人的名字的随机,但是我感觉,这里如果是随机生成人名,好像并没有什么意义,既然是多线程的编程,所以我的理解是通过的顺序要是随机的。
解决办法:使用线程回调的方法,将10个人的名字定义在回调类中,共享给其他10个线程,然后每个线程在输出人名的时候,给它进行同步,也就是将获得人名的方法进行同步操作,同时延迟5s输出人名,模拟通过时间为5s。
具体代码:
回调类:
package com.xgd.thread.test; /** * Package: com.xgd.thread.test * * File: ThroughCave.java * * Author: jiangpan Date: 2015年9月21日 * * Copyright @ 2015 Corpration Name * */ public class ThroughCave { private String[] name; public ThroughCave() { //在构造方法中初始化一个包含10个人名的String数组 String[] name = {"张三","李四","王五","马六","牛七","王八","小明","小红","小花","小雷"}; this.name = name; } //输出人名的方法,同步化synchronized public synchronized void PrintName(String name){ //延迟5s,模拟过山洞的时间为5s try { Thread.sleep(5000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println(name); } //将10个人名分给10个线程,模拟10个人 public void SendAllNames(){ for (int i = 0; i < name.length; i++) { GetNameThread gt = new GetNameThread(this, name[i]); gt.start(); } } public static void main(String[] args){ ThroughCave tc = new ThroughCave(); tc.SendAllNames(); } }
线程类:
package com.xgd.thread.test; /** * Package: com.xgd.thread.test * * File: GetNameThread.java * * Author: jiangpan Date: 2015年9月21日 * * Copyright @ 2015 Corpration Name * */ public class GetNameThread extends Thread{ private ThroughCave tcave; private String name; //初始化线程的时候,获得回调类对象和人名 public GetNameThread(ThroughCave tcave,String name) { this.tcave = tcave; this.name = name; } public void run(){ //输出人名,模拟过山洞 tcave.PrintName(name); } }