`
biaoming
  • 浏览: 269754 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

单个线程对多个线程的唤醒

    博客分类:
  • java
阅读更多
模拟两个线程之间的协作。 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();
    }
}
 
分享到:
评论

相关推荐

    java 参赛者的比赛生活(线程休眠唤醒)

    线程唤醒则通常与对象的监视器(Monitor Object)相关,即 `wait()` 和 `notify()` 或 `notifyAll()` 方法。当一个线程调用对象的 `wait()` 方法时,它会释放该对象的锁并进入等待状态,直到其他线程调用 `notify()`...

    多线程的运用e语言多线程 e多线程

    通过创建多个线程,每个线程可以独立执行一段代码,而不影响其他线程的运行。 二、E语言中的线程创建与管理 在E语言中,创建一个新的线程通常涉及到以下几个步骤: 1. 引入线程库:首先,你需要确保E语言支持多线程...

    易语言多线程控制线程数量源码

    在易语言中,线程用于在单个进程中同时执行多个独立的代码段,从而提高程序的执行效率。创建线程的基本步骤包括定义线程函数、创建线程对象和启动线程。线程函数通常包含需要并发执行的任务,而线程对象则代表了一个...

    delphi 的多线程控件

    在计算机科学中,线程是操作系统分配处理器时间的基本单位,一个进程可以包含一个或多个线程。多线程意味着在一个程序中创建并行运行的线程,使得某些计算或任务可以在后台进行,而不阻塞主线程,这样用户界面可以...

    java 多线程并发实例

    这种方式更灵活,因为Java不支持多重继承,但可以实现多个接口。 在并发控制中,我们通常会遇到以下几个关键概念: - 同步:确保同一时间只有一个线程访问共享资源,防止数据不一致。Java提供了synchronized关键字...

    Solaris2.4多线程编程

    在Solaris 2.4系统中,多线程编程是一种先进的技术,它允许在一个进程中同时执行多个线程,以提升程序的响应速度、资源利用率和性能。本文将深入探讨多线程的基本概念、优势以及如何利用Solaris提供的工具进行多线程...

    实验二、嵌入式Linux多线程编程实验

    通过这种方式,信号量可以防止多个线程同时进入临界区,确保了资源访问的安全性。 实验中,学生需要实现一个基于单个生产者和单个消费者的模型,这通常涉及到一个缓冲区,生产者线程生成数据放入缓冲区,消费者线程...

    多线程编程源代码

    在单个进程中创建多个线程,可以有效地利用处理器资源,提高程序的响应速度和整体性能。本资料包"多线程编程源代码"深入探讨了线程同步的各种技术,包括互斥量、信号量和事件同步,这些都是确保线程安全和避免竞态...

    Java多线程的等待唤醒机制代码演示通俗易懂

    Java多线程的等待唤醒机制代码演示 通过代码,完整的还原消费者和生产者的等待唤醒过程...- void wait() 当前线程等待,直到被其他线程唤醒 - void notify() 随机唤醒单个线程 - void notifyAll() 唤醒所有线程

    多线程编程指南.pdf

    多线程编程是指在单个程序中同时运行多个线程的技术,每个线程都是一个独立的控制流,可以在同一时间处理不同的任务。这种编程模式极大地提高了程序的效率和响应速度,特别是在多核处理器环境下。 **定义多线程术语...

    多线程编程 多线程编程

    多线程是指在单个应用程序中同时运行多个线程,每个线程都有自己的程序计数器、系统栈以及局部变量,共享同一内存空间。这种技术可以提高程序的响应速度和资源利用率,尤其是在执行I/O密集型或计算密集型任务时。 ...

    Linux多线程Linux多线程

    在Linux系统中,多线程是一种程序执行方式,它允许单个进程内同时运行多个并发执行的线程。这种技术可以提升程序的并发性,优化系统资源利用率,并提高整体性能。下面将详细介绍Linux多线程的相关知识点。 1. **...

    三个线程交错输出

    在单个进程中可以存在多个线程,这些线程可以并发执行,提高系统的并行性和效率。 三个线程交错输出的实现通常涉及到Java中的Thread类和synchronized关键字。每个线程会有一个特定的打印序列,例如线程A打印"ABC",...

    多线程使用原因以及例程

    1. **多线程定义**:多线程是指在单个进程中同时运行多个线程的能力。相比于单线程程序,多线程程序能够在同一时刻执行更多的任务,从而更好地利用系统资源,特别是CPU资源。 2. **并行与并发**: - **并行**:指...

    java多线程介绍

    当多个线程访问共享资源时,可能会出现竞态条件,为了解决这个问题,Java 引入了同步机制。`synchronized` 关键字用于实现线程同步,它可以修饰方法或代码块。修饰方法时,整个方法的执行是线程安全的;修饰代码块时...

    Java 多线程介绍

    Java多线程是Java编程语言中的一个重要特性,它允许在单个程序中同时执行多个线程,从而提高程序的效率和响应性。本文将深入探讨Java多线程的基础概念、线程的生命周期以及一些关键的线程控制方法,如`suspend()`和`...

    多线程控制红绿灯变化

    在IT领域,多线程是一种常见的编程技术,用于在单个程序中同时执行多个任务。在本场景中,“多线程控制红绿灯变化”是一个典型的并发编程问题,旨在模拟现实生活中交通信号灯的交替工作模式。这个系统设计通常涉及两...

    arduino 多线程ProtoThreads.zip

    在每次循环中,Protothreads库会检查每个“线程”的状态,根据需要唤醒或暂停它们,这样就实现了在单个线程上下文中模拟多任务的效果。 总的来说,Protothreads提供了一种有效的方法,让Arduino这样的微控制器可以...

    线程——基本线程的应用和线程调用控件

    - 并发性:多个线程可以同时执行,提高处理器利用率。 - 响应性:UI线程可以快速响应用户操作,而后台线程处理耗时任务,避免程序卡顿。 - 资源共享:线程间可以直接访问同一进程的内存,减少数据交换开销。 3. ...

Global site tag (gtag.js) - Google Analytics