提示:以下是本篇文章正文内容,下面案例可供参考
一、年轻人与老年人爬山练习题
1.题目需求
- 每个线程代表一个人
- 课设置没人爬山速度
- 每爬100米显示信息
- 爬到终点是给出相应提示
1.题目分析
-
1.需要定义的变量:
爬山100米需要的事件time;
要怕多少个100米num; -
创建对象时需要填入的信息,用构造完成
-
用线程休眠完成爬山的间隔
-
重写run方法
3.代码实现
public class ClimbThread extends Thread{
private int time;
private int num; //---->mile/100
// name 爬山人
// time 爬山人,爬100米的时间 单位秒
// mile 山的高度
public ClimbThread(String name,int time,int mile){
super(name);
//java线程休眠单位为毫秒,因为数据类型为int,需要转化为毫秒
this.time = time*1000;
//多少个100米,同时也是输出多少次
this.num = mile/100;
}
@Override
public void run() {
int runNum = 0; //用变量记录第几次100米
while (runNum<this.num){
try {
Thread.sleep(this.time); //线程休眠来实现爬山的间隔
runNum++;
System.out.println(Thread.currentThread().getName()+"爬完了"+(runNum*100)+"米");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//while循环结束代表已经到达山顶
System.out.println(Thread.currentThread().getName()+"到达山顶");
}
public static void main(String[] args) {
ClimbThread oldman = new ClimbThread("老年人", 2, 1000);
oldman.start();
ClimbThread youngman = new ClimbThread("年轻人", 1, 1000);
youngman.start();
}
}
4.运行结果
二、模拟病号看病
1.题目需求
- 某科室一天需要看普通号20个,特需号10个
- 特需号看病时间是普通号的两倍
- 开始时普通号和特需号并行叫号,交到特需号的概率比普通号告
- 当普通号叫到第十号时.要求先看完特需号,再看普通号
- 使用多线程模拟这一点
2.题目分析
把main线程作为普通号,自定义线程作为特需号,利用join()方法实现第四条需求,利用Thread父类的setProperty()方法设置线程优先级完成第三条需求,看病时间用线程的sleep()方法实现
3.代码实现
1.自定义线程类(特需号)
public class SpecialThread implements Runnable{
@Override
public void run() {
for (int i = 1; i <= 10; i++) {
System.out.println("专家号:"+i+"号病人正在看病");
try {
Thread.sleep(1000); //看病时间
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
2.main线程(普通号)
public class CommonThread {
public static void main(String[] args) {
Thread special = new Thread(new SpecialThread(), "专家号");
special.setPriority(Thread.MAX_PRIORITY);
Thread.currentThread().setPriority(Thread.MIN_PRIORITY);
special.start();
for (int i = 1; i <= 20; i++) {
System.out.println("普通号:" + i + "号病人正在看病");
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
if (i == 10) {
try {
special.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}