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

标签 java multithreading netbeans

我目前正在努力理解 Java 的多线程概念。我浏览了一个使用乌龟和野兔示例来解释多线程概念的教程,并且在很大程度上理解了视频教程的语法和逻辑。在视频教程的最后,Youtuber 给出了一个作业,涉及将多线程应用到奥林匹克赛道上。

利用我从示例中获得的知识,我能够创建 10 个线程(代表运动员),它们在一个循环中运行,执行 100 次(代表 100 米)。

我面临的挑战是,当线程调度器让一名运动员比其他 9 名运动员先跑完 100 米时,其余 9 个线程总是无法完成比赛。在标准赛道中通常不会出现这种情况。事实上,名为 Usain Bolts 的 Thread 首先达到 100,这并不意味着 Yohan Blake 如果当时在 90m,他应该停止运行。

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

我做了什么(没有用): 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();
}     
}

这是我的主要方法(我把它减少到 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();

 }
}

最佳答案

  1. My challenge is that ... the remaining 9 threads always do not complete their race.

这是由 isRaceWon() 引起的方法实现。您在每个运行者的每米处检查它。一旦第一个运行者达到 100 米,break在每个运行者循环的下一步调用(每个循环都赢得比赛

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

  1. I am also interested in getting the distance ... for each thread, so that I can use a function to return the positions of each Thread at the end of the race.

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

private synchronized finish() {
   finishingOrder.add(Thread.currentThread().getName())
}

并在“运行”循环之后调用它

别忘了调用join()对于您的 main 中的所有转轮线程.之后,finishingOrder将按完成顺序包含名称。

关于java - 当一个线程到达目的地时,其他线程停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32890998/

相关文章:

java - 使用proguard android的数组序列化异常

java - 创建一个灵活的临时游戏数据存储系统

java - 使用 MySQL 的 NetBeans 中的 SQL 语法错误

java - 持久化类在 ID 上给出空值

java - 捕获 IO 异常未执行

Javafx:无法在表格单元格中正确显示内容

java - android:onClick 监听器,仅用于 XML 中的 onTouch

c++ - 制作工作线程?

java - 找不到spring-boot-2.3.0.BUILD-SNAPSHOT.jar错误

java - 从 main 启动并行线程并等待结果