多线程休眠新手问题!!!!来人救命!!!!!!

timi先生
全栈领域新星创作者
2020-08-05 12:24:07

求救!
要求doStep 方法必须考虑跑步者的速度。如果跑步者的速度是每秒 2 步,则此方法应运行半秒;如果跑步者的速度为每秒 4 步,则此方法应运行四分之一秒。
然后输出尤塞恩和卡尔 2 秒内跑多少步。

我的程序如上图所示。考虑到方法有停止运行,我将2秒内停止运行的总时间合在一块一次休眠完成,然后运行输出尤塞恩 2秒跑2步,卡尔2秒跑2步。

结果看起来没啥问题,但第三个和第四个条件报错,提示尤塞恩需要更少的操作。 有人建议不要去判断是2还是4,说休眠时间就是1000/owner.getSpeed()。这个我无法理解,有没有人救救孩子!!!

...全文
2363 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_39936465 2020-08-06
  • 打赏
  • 举报
回复

public class Solution {
	
	public static void main(String[] args) {
		Runner r1=new Runner("尤塞恩", 4);
		Runner r2=new Runner("卡尔", 2);
		Stopwatch s1=new Stopwatch(r1);
		Stopwatch s2=new Stopwatch(r2);
		s1.start();
		s2.start();
		try {
			Thread.sleep(2000);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		r1.setStopped(true);
		r2.setStopped(true);
		while(s1.isAlive()||s2.isAlive()) {}
		System.out.println(r1.getName()+"2秒钟一共跑了"+r1.getStepNumber());
		System.out.println(r2.getName()+"2秒钟一共跑了"+r2.getStepNumber());
	}

}

class Runner{
	private String name;
	private int speed;
	private boolean isStopped;
	private int stepNumber;
	public Runner(String name, int speed) {
		super();
		this.name = name;
		this.speed = speed;
		this.isStopped=false;
		this.stepNumber=0;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getSpeed() {
		return speed;
	}
	public void setSpeed(int speed) {
		this.speed = speed;
	}
	public boolean isStopped() {
		return isStopped;
	}
	public void setStopped(boolean isStopped) {
		this.isStopped = isStopped;
	}
	public int getStepNumber() {
		return stepNumber;
	}
	public void setStepNumber(int stepNumber) {
		this.stepNumber = stepNumber;
	}
	
}

class Stopwatch extends Thread{
	private Runner owner;

  Stopwatch(Runner owner) {
		this.owner = owner;
	}
	@Override
	public void run() {
		// TODO Auto-generated method stub
		while(!owner.isStopped()) {
				doStep();
		}
	}
	
	void doStep() {
		try {
			Thread.sleep(1000/owner.getSpeed());
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		owner.setStepNumber(owner.getStepNumber()+1);
	}
	
}

qq_39936465 2020-08-06
  • 打赏
  • 举报
回复
引用 2 楼 任何时候努力都不会迟 的回复:
之后改过,还是不行的!
你这个当然不行咯,2个人的步数是不同的需要不同的变量来计算,你把2个人用一个变量来计算步数不就混乱了么?
kimsung 2020-08-05
  • 打赏
  • 举报
回复
timi先生 2020-08-05
  • 打赏
  • 举报
回复
[/quote] 你题目都没看清楚么? 每秒2步也就是说一步需要半秒时间500ms,也就是说该程序每停顿500ms运行一次,每秒4步就是250ms,程序每停顿250ms运行一次,相当于每次运行都是踏出一步。你sleep1000 和1500是怎么得出来的?[/quote] 之后改过,还是不行的!
qq_39936465 2020-08-05
  • 打赏
  • 举报
回复
引用 楼主 任何时候努力都不会迟 的回复:
求救! 要求doStep 方法必须考虑跑步者的速度。如果跑步者的速度是每秒 2 步,则此方法应运行半秒;如果跑步者的速度为每秒 4 步,则此方法应运行四分之一秒。 然后输出尤塞恩和卡尔 2 秒内跑多少步。 我的程序如上图所示。考虑到方法有停止运行,我将2秒内停止运行的总时间合在一块一次休眠完成,然后运行输出尤塞恩 2秒跑2步,卡尔2秒跑2步。 结果看起来没啥问题,但第三个和第四个条件报错,提示尤塞恩需要更少的操作。 有人建议不要去判断是2还是4,说休眠时间就是1000/owner.getSpeed()。这个我无法理解,有没有人救救孩子!!!
你题目都没看清楚么? 每秒2步也就是说一步需要半秒时间500ms,也就是说该程序每停顿500ms运行一次,每秒4步就是250ms,程序每停顿250ms运行一次,相当于每次运行都是踏出一步。你sleep1000 和1500是怎么得出来的?

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧