您的位置:首页 > 编程语言 > Java开发

Java作业-十个人过山洞(多线程)

2017-12-07 20:30 169 查看
目标效果:



代码:

package Eight;

import java.util.Random;

/**
* 编写多线程程序,模拟多个人通过一个山洞。
* 这个山洞每次只能通过一个人,每个人通过山洞的时间为1秒(sleep)。
* 随机生成10个人,都要通过此山洞,用随机值对应的字符串表示人名,打印输出每次通过山洞的人名。
* 提示:利用线程同步机制,过山洞用一条输出语句表示,该输出语句打印输出当前过山洞的人名,
* 每个人过山洞对应一个线程,哪个线程执行这条输出语句,就表示哪个人过山洞。

* @author Vivinia
*
*/
public class AcrossCave {
public static void main(String[] args) {
Cave cave=new Cave();      //实例化一个山洞
for(int i=0;i<10;i++) {
new Thread(cave,getRandomString(6)).start();      //生成字符串立即命名为线程的名字,代表十个人
}
}

private static String getRandomString(int length) {  //length表示生成字符串的长度
String base="abcdefghijklmnopqrstuvwxyz";
Random random=new Random();
StringBuffer sb=new StringBuffer();   //可以追加字符,单纯的String不可以追加
for(int i=0;i<length;i++) {
int number=random.nextInt(base.length());
sb.append(base.charAt(number));     //追加新生成数字对应的字符
}
return sb.toString();     //charAt返回base字符串中下标为number的字符(从0开始),再追加到sb字符串中
}
}

class Cave implements Runnable{     //山洞类

@Override
public synchronized void run() {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
System.out.println(Thread.currentThread().getName()+"通过了山洞");   //获取当前线程的名字,即为人的名字
}
}
}


我是渣渣,今天复习发现之前的多线程都做错了,我一直在主线程里懵逼来懵逼去:
1.之前一直以为实现Runnable接口方法创建线程,只要调用run方法就是启动线程了,如今才发现我真的好天真,run只是调用那个方法,不管哪种创建线程的方法,启动都要调用start
2.题目要求的是十个人穿越一个山洞,一个一个走,但是我愣是整了十个人一人一个山洞,所以同时走的,坑爹
3.现在是创建线程时直接把生成的字符串当作线程名字,这样一定不会错了,思路比较清晰了

多线程我一直不太会,如果还有错误请大佬留言。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: