模拟两个线程之间的协作。
Athele
类有两个同步方法
prepare()
和
go()
。标志位
start
用于判断当前线程是否需要
wait()
。
Referee
类的实例首先启动所有的
Athele
类实例,使其进入
wait()
状态,在一段时间后,改变标志位并
notifyAll()
所有处于
wait
状态的
Athele
线程。
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import java.util.concurrent.TimeUnit;
class Athlete implements Runnable {
private boolean start = false;
private final int id;
public Athlete(int id) {
this.id = id;
}
public boolean equals(Object o) {
if (!(o instanceof Athlete))
return false;
Athlete athlete = (Athlete) o;
return id == athlete.id;
}
public String toString() {
return "Athlete<" + id + ">";
}
public int hashCode() {
return new Integer(id).hashCode();
}
public synchronized void prepare() throws InterruptedException {
System.out.println(this + " ready!");
while (start == false)
wait();
if (start == true)
System.out.println(this + " go!");
}
public synchronized void go() {
start = true;
notifyAll();
}
public void run() {
try {
prepare();
} catch (InterruptedException e) {
//maybe should notify the referee
System.out.println(this+" quit the game");
}
}
}
class Referee implements Runnable {
private Set<Athlete> players = new HashSet<Athlete>();
public void addPlayer(Athlete one) {
players.add(one);
}
public void removePlayer(Athlete one) {
players.remove(one);
}
public void ready() {
Iterator<Athlete> iter = players.iterator();
while (iter.hasNext())
new Thread(iter.next()).start();
}
public void action() {
Iterator<Athlete> iter = players.iterator();
while (iter.hasNext())
iter.next().go();
}
public void run() {
ready();
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
action();
}
}
public class Game {
public static void main(String[] args) {
Referee referee = new Referee();
for (int i = 0; i < 10; i++)
referee.addPlayer(new Athlete(i));
new Thread(referee).start();
}
}
分享到:
相关推荐
线程唤醒则通常与对象的监视器(Monitor Object)相关,即 `wait()` 和 `notify()` 或 `notifyAll()` 方法。当一个线程调用对象的 `wait()` 方法时,它会释放该对象的锁并进入等待状态,直到其他线程调用 `notify()`...
通过创建多个线程,每个线程可以独立执行一段代码,而不影响其他线程的运行。 二、E语言中的线程创建与管理 在E语言中,创建一个新的线程通常涉及到以下几个步骤: 1. 引入线程库:首先,你需要确保E语言支持多线程...
在易语言中,线程用于在单个进程中同时执行多个独立的代码段,从而提高程序的执行效率。创建线程的基本步骤包括定义线程函数、创建线程对象和启动线程。线程函数通常包含需要并发执行的任务,而线程对象则代表了一个...
Java多线程的等待唤醒机制代码演示 通过代码,完整的还原消费者和生产者的等待唤醒过程 ...- void wait() 当前线程等待,直到被其他线程唤醒 - void notify() 随机唤醒单个线程 - void notifyAll() 唤醒所有线程
在计算机科学中,线程是操作系统分配处理器时间的基本单位,一个进程可以包含一个或多个线程。多线程意味着在一个程序中创建并行运行的线程,使得某些计算或任务可以在后台进行,而不阻塞主线程,这样用户界面可以...
这种方式更灵活,因为Java不支持多重继承,但可以实现多个接口。 在并发控制中,我们通常会遇到以下几个关键概念: - 同步:确保同一时间只有一个线程访问共享资源,防止数据不一致。Java提供了synchronized关键字...
在Solaris 2.4系统中,多线程编程是一种先进的技术,它允许在一个进程中同时执行多个线程,以提升程序的响应速度、资源利用率和性能。本文将深入探讨多线程的基本概念、优势以及如何利用Solaris提供的工具进行多线程...
通过这种方式,信号量可以防止多个线程同时进入临界区,确保了资源访问的安全性。 实验中,学生需要实现一个基于单个生产者和单个消费者的模型,这通常涉及到一个缓冲区,生产者线程生成数据放入缓冲区,消费者线程...
在单个进程中创建多个线程,可以有效地利用处理器资源,提高程序的响应速度和整体性能。本资料包"多线程编程源代码"深入探讨了线程同步的各种技术,包括互斥量、信号量和事件同步,这些都是确保线程安全和避免竞态...
Java多线程的等待唤醒机制代码演示 通过代码,完整的还原消费者和生产者的等待唤醒过程...- void wait() 当前线程等待,直到被其他线程唤醒 - void notify() 随机唤醒单个线程 - void notifyAll() 唤醒所有线程
多线程编程是指在单个程序中同时运行多个线程的技术,每个线程都是一个独立的控制流,可以在同一时间处理不同的任务。这种编程模式极大地提高了程序的效率和响应速度,特别是在多核处理器环境下。 **定义多线程术语...
多线程是指在单个应用程序中同时运行多个线程,每个线程都有自己的程序计数器、系统栈以及局部变量,共享同一内存空间。这种技术可以提高程序的响应速度和资源利用率,尤其是在执行I/O密集型或计算密集型任务时。 ...
在Linux系统中,多线程是一种程序执行方式,它允许单个进程内同时运行多个并发执行的线程。这种技术可以提升程序的并发性,优化系统资源利用率,并提高整体性能。下面将详细介绍Linux多线程的相关知识点。 1. **...
在单个进程中可以存在多个线程,这些线程可以并发执行,提高系统的并行性和效率。 三个线程交错输出的实现通常涉及到Java中的Thread类和synchronized关键字。每个线程会有一个特定的打印序列,例如线程A打印"ABC",...
1. **多线程定义**:多线程是指在单个进程中同时运行多个线程的能力。相比于单线程程序,多线程程序能够在同一时刻执行更多的任务,从而更好地利用系统资源,特别是CPU资源。 2. **并行与并发**: - **并行**:指...
当多个线程访问共享资源时,可能会出现竞态条件,为了解决这个问题,Java 引入了同步机制。`synchronized` 关键字用于实现线程同步,它可以修饰方法或代码块。修饰方法时,整个方法的执行是线程安全的;修饰代码块时...
Java多线程是Java编程语言中的一个重要特性,它允许在单个程序中同时执行多个线程,从而提高程序的效率和响应性。本文将深入探讨Java多线程的基础概念、线程的生命周期以及一些关键的线程控制方法,如`suspend()`和`...
在IT领域,多线程是一种常见的编程技术,用于在单个程序中同时执行多个任务。在本场景中,“多线程控制红绿灯变化”是一个典型的并发编程问题,旨在模拟现实生活中交通信号灯的交替工作模式。这个系统设计通常涉及两...
在每次循环中,Protothreads库会检查每个“线程”的状态,根据需要唤醒或暂停它们,这样就实现了在单个线程上下文中模拟多任务的效果。 总的来说,Protothreads提供了一种有效的方法,让Arduino这样的微控制器可以...
- 并发性:多个线程可以同时执行,提高处理器利用率。 - 响应性:UI线程可以快速响应用户操作,而后台线程处理耗时任务,避免程序卡顿。 - 资源共享:线程间可以直接访问同一进程的内存,减少数据交换开销。 3. ...