java多线程百米赛跑_多线程-百米赛跑

importjava.util.ArrayList;importjava.util.List;importjava.util.Random;importjava.util.concurrent.CountDownLatch;importjava.util.concurrent.CyclicBarrier;importjava.util.concurrent.locks.Lock;importjava.util.concurrent.locks.ReentrantLock;public classCountDownLatchTest {//运动员数量量

private static int SPORTSMAN_COUNT = 10;private static final Random random = newRandom();//用于判断发令之前运动员是否已经进⼊入准备状态,需要等待10个运动员准备就绪,占有锁,等待10个运动员完成,释放锁。

private static CountDownLatch readyLatch = newCountDownLatch(SPORTSMAN_COUNT);//⽤用于判断裁判是否已经发令,占有锁,等待裁判发令完成,释放锁

private static CountDownLatch startLatch = new CountDownLatch(1);//设置终点屏障,⽤用于计算成绩

private static CyclicBarrier cb = new CyclicBarrier(SPORTSMAN_COUNT, newRunnable() {

@Overridepublic voidrun() {

CountDownLatchTest.transcript.sort((Sportsman p1, Sportsman p2)-> p1.getTranscript() -p2.getTranscript());

System.out.println("排名成绩单:" +CountDownLatchTest.transcript);

CountDownLatchTest.transcript.clear();

}

});//成绩单

private static List transcript = new ArrayList(SPORTSMAN_COUNT);public static voidmain(String[] args) {//用于判断发令之前运动员是否已经进⼊准备状态,需要等待10个运动员准备就绪,占有锁,等待10 个运动员完成,释放锁。//CountDownLatch readyLatch = new CountDownLatch(SPORTSMAN_COUNT);//⽤用于判断裁判是否已经发令,占有锁,等待裁判发令完成,释放锁//CountDownLatch startLatch = new CountDownLatch(1);//启动10个线程,也就是10个运动员,做准备⼯工作

for (int i = 0; i < SPORTSMAN_COUNT; i++) {

Thread t= new Thread(new RunTask((i + 1) + "号运动员", readyLatch, startLatch));

t.start();

}//当前运动员在其他运动员准备就绪前⼀一直等待,也就是说等readyLatch倒数计数器器为0之前⼀一直等待

try{

readyLatch.await();

}catch(InterruptedException e) {

e.printStackTrace();

}//裁判发令,释放锁

startLatch.countDown();

System.out.println("裁判:所有运动员准备完毕,开始跑...");

}/**运动员类*/

static classSportsman {privateString name;private inttranscript;public Sportsman(String name, inttranscript) {this.name =name;this.transcript =transcript;

}

@Overridepublic booleanequals(Object obj) {boolean result = false;if (obj instanceofSportsman) {

result= ((Sportsman) obj).getTranscript() == this.transcript;

}returnresult;

}

@OverridepublicString toString() {return this.name + ":" + this.transcript + " ms";

}publicString getName() {returnname;

}public intgetTranscript() {returntranscript;

}

}/**跑任务类*/

static class RunTask implementsRunnable {private Lock lock = newReentrantLock();privateCountDownLatch ready;privateCountDownLatch start;privateString name;/*** (构造⽅方法)

*@paramready

*@paramstart

*@paramname 运动员名称*/

publicRunTask(String name, CountDownLatch ready, CountDownLatch start) {this.ready =ready;this.start =start;this.name =name;

}

@Overridepublic voidrun() {

lock.lock();try{//运动员准备就绪的逻辑,准备readyTime秒

int readyTime = random.nextInt(1000);

System.out.println(name+ ":我需要" + readyTime + "秒的时间准备。");try{

Thread.sleep(readyTime);

}catch(InterruptedException e) {

e.printStackTrace();

}

System.out.println(name+ "我已经准备完毕!");//释放锁readyLatch-1,表示⼀一个运动员已经就绪

ready.countDown();//待裁判发开始命令

try{

start.await();

}catch(InterruptedException e) {

}

System.out.println(name+ ":开跑...");int costTime = random.nextInt(500);try{

Thread.sleep(costTime);

}catch(InterruptedException e) {

e.printStackTrace();

}

System.out.println(name+ ":开跑到达终点。成绩:" + costTime + "ms");

transcript.add(newSportsman(name, costTime));//等待成绩

cb.await();

}catch(Exception e) {

}finally{

lock.unlock();

}

}

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个使用Java线程实现的Swing龟兔赛跑的例子: ```java import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; public class Race extends JFrame { private JLabel rabbitLabel; private JLabel turtleLabel; private JButton startButton; public Race() { setTitle("龟兔赛跑"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setSize(400, 200); setLayout(new FlowLayout()); rabbitLabel = new JLabel(new ImageIcon("rabbit.png")); turtleLabel = new JLabel(new ImageIcon("turtle.png")); startButton = new JButton("开始赛跑"); startButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { startRace(); } }); add(rabbitLabel); add(turtleLabel); add(startButton); } private void startRace() { Thread rabbitThread = new Thread(new Runnable() { @Override public void run() { for (int i = 0; i <= 100; i += 10) { rabbitLabel.setLocation(i, rabbitLabel.getY()); try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } } JOptionPane.showMessageDialog(null, "兔子赢了!"); } }); Thread turtleThread = new Thread(new Runnable() { @Override public void run() { for (int i = 0; i <= 100; i += 5) { turtleLabel.setLocation(i, turtleLabel.getY()); try { Thread.sleep(200); } catch (InterruptedException e) { e.printStackTrace(); } } JOptionPane.showMessageDialog(null, "乌龟赢了!"); } }); rabbitThread.start(); turtleThread.start(); } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { Race race = new Race(); race.setVisible(true); } }); } } ``` 这个例子使用了Java的Swing库来创建一个窗口,其中包含了兔子和乌龟的图片以及一个开始赛跑的按钮。当点击开始赛跑按钮时,会创建两个线程分别控制兔子和乌龟的移动。每个线程都会在一定的时间间隔内移动对应的图片,直到达到终点位置。当其中一个线程到达终点时,会弹出一个对话框显示谁赢了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值