当一个线程到达目的地时,其他线程停止

CYN*_*ing 5 java multithreading netbeans

我目前正致力于理解多线程的Java概念.我经历了一个使用Tortoise和Hare示例的教程来解释多线程的概念,并且在很大程度上我理解了视频教程的语法和逻辑.在视频教程的最后,Youtuber做了一项任务,涉及将多线程应用于奥运赛道.

使用我的示例中的知识,我能够创建在循环内运行的10个线程(代表运动员),执行100次(代表100米).

我的挑战是,当线程调度员使运动员在其他9名运动员之前达到100米时,其余9个线程总是不能完成他们的比赛.在标准赛道中通常不是这种情况.一个名为Usain Bolts的线程首先达到100,这并不意味着如果Yohan Blake当时处于90米,他应该停止运行.

我也有兴趣获得每个线程的距离(注意它们都使用相同的变量),这样我就可以使用函数在比赛结束时返回每个线程的位置.

我做了什么(没有用):1)我试图使用一个if else结构(包含九个"else"语句)来将每个执行线程的距离分配给一个新的整数变量.(使用Thread.currentThread().getName()属性和每个线程的名称)但这对我来说效果不佳.这是尝试使用他们的距离单独为运动员提供位置,但对未完成比赛的9名运动员没有任何作用.
2)我还尝试使用ArrayList在运行时填充距离,但由于一些奇怪的原因,每次想要添加另一个距离时,它仍会覆盖距离.

以下是我的代码:

package olympics100meters;

import java.util.ArrayList;

public class HundredMetersTrackRules implements Runnable {
public static String winner;

public void race() {
for (int distance=1;distance<=50;distance++) {
System.out.println("Distance covered by "+Thread.currentThread    ().getName  ()+" is "+distance+" meters.");


boolean isRaceWon=this.isRaceWon(distance);
if (isRaceWon) {
ArrayList<Integer> numbers = new ArrayList();
numbers.add(distance);
System.out.println("testing..."+numbers);
break;
}

}
}


private boolean isRaceWon(int totalDistanceCovered) {
   boolean isRaceWon=false;
   if ((HundredMetersTrackRules.winner==null)&&    (totalDistanceCovered==50)) {
   String winnerName=Thread.currentThread().getName();
   HundredMetersTrackRules.winner=winnerName;
   System.out.println("The winner is "+HundredMetersTrackRules.winner);
   isRaceWon=true;
   }

   else if (HundredMetersTrackRules.winner==null) {
   isRaceWon=false;
   }

   else if (HundredMetersTrackRules.winner!=null) {
   isRaceWon=true;
   }
   return isRaceWon;
}

public void run() {
this.race();
}     
}
Run Code Online (Sandbox Code Playgroud)

这是我的主要方法(我把它减少到5名运动员,直到我解决问题):

public class Olympics100Meters {

/**
 * @param args the command line arguments
 */
 public static void main(String[] args) {
   HundredMetersTrackRules racer=new HundredMetersTrackRules();
   Thread UsainBoltThread=new Thread(racer,"UsainBolt");
   Thread TysonGayThread=new Thread (racer,"TysonGay");
   Thread AsafaPowellThread=new Thread(racer,"AsafaPowell");
   Thread YohanBlakeThread=new Thread (racer,"YohanBlake");
   Thread JustinGatlinThread=new Thread (racer,"JustinGatlin");

   UsainBoltThread.start();
   TysonGayThread.start();
   AsafaPowellThread.start();
   YohanBlakeThread.start();
   JustinGatlinThread.start();

 }
}
Run Code Online (Sandbox Code Playgroud)

Nik*_*sov 0

  1. 我的挑战是……剩下的 9 个线程总是无法完成它们的比赛。

这是由isRaceWon()方法实现引起的。您在每个跑步者的每一米处检查它。一旦第一个跑者跑完 100 米,就break开始每个跑者循环的下一步(每个循环都赢得比赛)

volatile statuc String顺便说一句,使用获胜者的名字是有意义的,以避免 java 的内存模型含糊不清。

  1. 我也有兴趣获取每个线程的距离...,以便我可以使用一个函数在比赛结束时返回每个线程的位置。

如果最终目标是获得位置,则创建一个类字段public List<String> finishingOrder = new ArrayList<String>和一个方法finish

private synchronized finish() {
   finishingOrder.add(Thread.currentThread().getName())
}
Run Code Online (Sandbox Code Playgroud)

并在“run”循环之后调用它

不要忘记join()调用main. 之后,finishingOrder将包含按完成顺序排列的名称。