package com.test;
import java.util.Random;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class CountDownLatchTest
{
/**
* @param args
*/
public static void main(String[] args)
{
final CountDownLatch referee = new CountDownLatch(1); // 1名裁判
final CountDownLatch athlete = new CountDownLatch(3); // 3个运行员
ExecutorService pool = Executors.newCachedThreadPool();
for (int i = 0; i < 3; i++)
{
pool.execute(new Runnable()
{
public void run()
{
System.out.println("运动员:"
+ Thread.currentThread().getName() + "准备就绪!");
try
{
referee.await();
System.out.println("运动员:"
+ Thread.currentThread().getName() + "开始起跑!");
Thread.sleep(new Random().nextInt(10000));
}
catch (InterruptedException e)
{
e.printStackTrace();
}
athlete.countDown();
System.out.println("运行员:"
+ Thread.currentThread().getName() + "完成比赛!");
}
});
}
try
{
Thread.sleep(new Random().nextInt(10000));
System.out.println("裁判:"
+ Thread.currentThread().getName() + "命令发出");
referee.countDown(); //起跑命令
System.out.println("裁判:"
+ Thread.currentThread().getName() + "等待结果");
athlete.await();
System.out.println("裁判:"
+ Thread.currentThread().getName() + "公布结果");
}
catch (InterruptedException e)
{
e.printStackTrace();
}
pool.shutdown();
}
}
分享到:
相关推荐
在上述例子中,它被用来模拟一场有5位运动员的比赛,确保所有运动员都准备好后比赛才开始,并且所有运动员都完成比赛后比赛才结束。 首先,我们来看一下`CountDownLatch`的基本原理。构造`CountDownLatch`时需要...
在上述的百米赛跑例子中,CountDownLatch被巧妙地应用了。`CountDownLatch(int count)`构造函数接收一个初始计数值,表示需要等待的线程数量。每个线程完成任务后,调用`countDown()`方法使计数值减一,直到计数值减...
例如,在篮球比赛的例子中,控球后卫(主线程)等待所有球员到位后才开始进攻。 ```java CountDownLatch countDownLatch = new CountDownLatch(5); // 5位球员 // 模拟球员到位 for (int i = 0; i ; i++) { ...
在上面的例子中,我们使用CountDownLatch来控制线程的执行顺序,使得主线程等待代表选手的线程执行完成后再执行。我们可以看到,通过CountDownLatch的使用,我们控制了线程的执行顺序。在上面的代码中,我们使用到...
在Java中,我们可以使用各种并发工具类,如`java.util.concurrent`包中的`CountDownLatch`或`CyclicBarrier`,来更精确地控制线程之间的交互。 此外,"RTCRunGame"可能是包含这个多线程赛跑游戏完整实现的源代码...
这个例子展示了4个线程(参与者)各自执行`doSomething()`,然后在`CyclicBarrier`上等待,直到所有线程都到达,才会执行回调函数,表示所有准备工作完成,比赛开始。 总结来说,`java.util.concurrent`包中的`...
- 可能使用了`java.util.concurrent`包中的工具类,比如`CountDownLatch`或`CyclicBarrier`,来确保所有线程准备好后再开始比赛。 4. **GUI(图形用户界面)**: - 提供的`tuzi.gif`和`wugui.gif`可能是龟和兔的...
`java.util.concurrent`包提供了线程和锁的高级工具,如ExecutorService、Future和Callable接口,以及Semaphore和CountDownLatch等同步工具,帮助开发者编写高效的多线程程序。 最后,本书可能会涵盖Java的最新特性...
- **CountDownLatch**:可能被用来确保所有线程完成特定操作后,比赛才能结束。在龟兔赛跑的例子中,可以设置一个计数器为2(代表龟和兔),每只动物到达终点时减一,直到计数器归零。 - **CyclicBarrier**:类似...
在代码中,我们需要确保所有的线程都准备好后,才开始比赛,这通常通过一个共享信号量或者同步机制(如`CountDownLatch`)来实现。 在运行过程中,观察哪个线程(马)先完成(到达终点),可以直观地看出优先级的...
在这个压缩包中,我们可以找到一个名为 "multithreading-master" 的文件夹,它可能包含了多个关于多线程的示例项目,比如生产者消费者问题和龟兔赛跑的模拟。 首先,让我们来详细了解一下Java中的多线程。在单线程...
对于三个运动员的例子,可以设置一个 CyclicBarrier,当所有运动员都到达“起跑线”(屏障点)后,比赛开始。 5. **FutureTask 和 Callable**: `FutureTask` 是一个实现了 `RunnableFuture` 接口的任务,它允许你...
为了确保比赛的公平性,我们需要使用同步机制,如`synchronized`关键字、`wait()`、`notify()`或Java并发包(`java.util.concurrent`)中的工具类,如`Semaphore`或`CountDownLatch`,来控制线程的执行顺序和资源访问...