Ank*_*kla 6 java multithreading race-condition
编写一个名为RaceHorse的类来扩展Thread.每个RaceHorse都有一个名称和run()方法,显示名称5000次.编写一个实例化2个RaceHorse对象的Java应用程序.完成的最后一场RaceHorse是失败者.
这是个问题.我已经编写了两个类的代码两个运行线程以下是代码:
赛马
class RaceHorse extends Thread
{
public String name;
public RaceHorse(String name)
{
this.name = name;
}
public void run()
{
for(int i = 1 ; i <= 5000; i++)
{
System.out.println(i+" "+name);
}
System.out.println(name+" finished.");
}
}
Run Code Online (Sandbox Code Playgroud)
跑步者
class Runner{
public static void main(String args[])
{
RaceHorse obj = new RaceHorse("Lol");
RaceHorse obj2 = new RaceHorse("BOL");
Thread t = new Thread(obj);
Thread t2 = new Thread(obj2);
t.start();
t2.start();
}
}
Run Code Online (Sandbox Code Playgroud)
现在我的问题是我无法找到首先完成哪个线程以及哪个秒,即哪个马获胜哪个失败.
cHa*_*Hao 12
首先:你的RaceHorse对象本身就是线程.你应该能够说出来obj.start();并且它也能正常工作.所以删除t并t2完全.
接下来,您需要一些方法来通知主线程有关获胜者的信息.
public void run()
{
... your loop stuff ...
// this is how we're going to do the notification.
Runner.done();
}
public class Runner
{
private static RaceHorse winner = null;
synchronized static void done()
{
// Threads calling this are going to be RaceHorse objects.
// Now, if there isn't already a winner, this RaceHorse is the winner.
if (winner == null) winner = (RaceHorse) Thread.currentThread();
}
public static void main(String[] args)
{
... create the horses ...
// start the horses running
obj.start();
obj2.start();
// wait for them to finish
obj.join();
obj2.join();
System.out.println(winner.name + " wins!");
}
}
Run Code Online (Sandbox Code Playgroud)
毫无疑问是一种更好的方法,但是一种方法可能是创建一个线程安全的类(例如'Trophy'),有一个方法'getTrohpy'只在第一次调用时返回true,并传递对一个实例的引用两个线程的奖杯.
| 归档时间: |
|
| 查看次数: |
2690 次 |
| 最近记录: |