`

使用同步队列解决任务协作问题

阅读更多
Java API里面提供了许多同步队列,你可以使用它来解决任务协作问题。同步队列在任何时刻都只允许一个任务插入或移除元素。例子如下:


===============基本线程类

public class LiftOff implements Runnable {   
     protected int countDown = 10;   
      private static int taskCount = 0;   
     private final int id = taskCount++;   
    
      public LiftOff() {   
      }   
    
      public LiftOff(int countDown) {   
          this.countDown = countDown;   
      }   
    
        public String status() {   
          return "#" + id + "(" + (countDown > 0 ? countDown : "Liftoff!") + "),";   
      }   
    
      @Override  
      public void run() {   
         while (countDown-- > 0) {   
              System.out.println(status());   
              Thread.yield();   
          }   
     }   
   
 }


==============================

public class LiftOffRunner implements Runnable{

 private BlockingQueue rockets;
 
 public LiftOffRunner(BlockingQueue queue) {
  // TODO Auto-generated constructor stub
  rockets=queue;
 }
 
 public void add(LiftOff lo){
  try {
   rockets.put(lo);
  } catch (InterruptedException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  //BloIllegalStateException
 }
 
 
 @Override
 public void run() {
  // TODO Auto-generated method stub
  try {
   while(!Thread.interrupted()){
    LiftOff rocket=rockets.take();
    rocket.run();
   }
  } catch (InterruptedException e) {
   // TODO Auto-generated catch block
      System.out.println("Weaking From take()");
  }
  System.out.println(" Exiting LiftOffRunner()");
 }
}

=========================测试类TestBlockingQueues

public class TestBlockingQueues {

 static void getKey(){
  try {
   new BufferedReader(new InputStreamReader(System.in)).readLine();
  } catch (IOException e) {
   // TODO Auto-generated catch block
   throw new RuntimeException(e);
  }
  
 }
 
 
 static void getKey(String message){
  System.out.println(""+message);
  getKey();
 }
 
 
 static void test(String msg,BlockingQueue queue)
 {
  System.out.println(msg);
  LiftOffRunner runner=new LiftOffRunner(queue);
  Thread t=new Thread(runner);
  t.start();
  for(int i=0;i());
  test("ArrayBlockingQueue",new ArrayBlockingQueue(3));
  test("SynchronousQueue",new SynchronousQueue());
  
  
 }
}
===================测试结果如下:



分享到:
评论

相关推荐

    Python_通过促进协作智能,CrewAI使代理能够无缝地协同工作,处理复杂的任务.zip

    4. **状态同步**:所有代理需要共享一致的世界视图,这可能通过分布式数据库(如`Apache Cassandra`)或消息队列服务(如`RabbitMQ`)实现。 5. **容错与恢复机制**:考虑到系统的复杂性和可能的故障,需要有健壮的...

    嵌入式系统及应用:uCOS-II原理3_任务的同步与通信.ppt

    《嵌入式系统及应用:...总的来说,μC/OS-II通过精心设计的同步和通信机制,有效地解决了嵌入式系统中多任务的协作问题,确保了系统的稳定性和效率。理解并熟练运用这些机制对于开发高效、可靠的嵌入式应用至关重要。

    线程同步生产者消费者问题解析

    为解决这个问题,我们可以利用线程同步机制,如Java中的`wait()`、`notify()`和`notifyAll()`方法,或者使用`Semaphore`、`BlockingQueue`等高级并发工具。在C++中,可以使用条件变量(condition variable)配合互斥...

    多线程 队列利用

    在多线程环境下,队列的使用可以解决资源争抢问题,避免阻塞,提高系统吞吐量。例如,`BlockingQueue`的一个关键特性是其阻塞性质:当队列为空时,尝试从中取元素的线程会被阻塞,直到有新的元素加入;反之,当队列...

    linux下实现生产者与消费者问题

    Linux下的生产者与消费者问题实现使用了 POSIX 线程库和信号量来实现同步。通过使用信号量和互斥锁,可以实现生产者和消费者之间的同步,避免缓冲区溢出或不足。 八、应用场景 生产者与消费者问题的实现有广泛的...

    VxWorks下的任务监控方法及应用

    除了状态监控,还可以设置任务间的通信机制,如信号量、消息队列或邮箱,以确保任务间的同步和协作正常。如果发现通信失败或等待超时,这可能是任务异常的迹象。同时,可以利用Wind River的WindView工具,它提供了一...

    java分布式数据库同步系统(解决中美异地机房).rar

    1. 分布式系统基础:分布式系统是由多台独立的计算机节点通过网络连接构成,共同协作完成一个任务。在Java中,可以利用RMI(远程方法调用)、JMS(Java消息服务)等技术来实现节点间的通信。 2. 数据库复制:数据库...

    09队列:队列在线程池等有限资源池中的应用.pdf

    队列是一种先进先出(FIFO, First In First Out)的数据结构,与栈(后进先出,LIFO)相对应。...通过深入理解队列的原理和实现方式,开发者可以更好地利用这一数据结构解决实际问题,提高软件的性能和可靠性。

    C语言标准库实现的非实时抢占多任务.zip

    C语言作为一种强大的编程语言,为这类任务提供了灵活且高效的解决方案。 首先,我们要理解“非实时抢占多任务”的概念。非实时意味着任务的执行顺序不依赖于外部事件的时间精确性,而是根据程序的内部调度机制进行...

    操作系统 DOS 多任务系统OS 报告 (含代码)

    生产者-消费者问题是操作系统中的一个经典问题,它展示了如何通过同步机制协调两个或多个线程间的协作。在本项目中,生产者线程计算1到50的平方,将结果存入缓冲区;消费者线程则从缓冲区取出结果并打印。为了保证...

    工业机器人控制器实时多任务软件设计与实现.pdf

    在控制器系统中实现多任务协作运行方式,需要合理分配任务优先级,优化调度策略,并结合上述同步与通信机制,确保不同任务之间的协调与高效执行。 总结以上,本文所述的工业机器人控制器实时多任务软件设计与实现,...

    多任务下的数据结构与算法

    算法是解决问题的具体步骤,尤其在多任务场景下,设计良好的算法能显著提升性能。并行和并发算法,如分治法、动态规划、贪心策略和回溯法,可以被用来解决复杂问题,同时充分利用多核处理器的计算能力。此外,多线程...

    freeRTOS协程中的队列通信.zip_freeRTOS 例程_freertos_poetdxh

    7. **多协程协作**:在实际应用中,可能有多个协程同时使用一个队列,理解如何正确地协调它们以避免数据竞争和死锁是至关重要的。 在提供的压缩包文件中,"RTOS"可能包含了FreeRTOS的源代码和配置文件,"Startup...

    多任务下的数据结构和算法附书代码

    - **线程与进程**:创建、同步和通信机制,如互斥锁、信号量、条件变量,用于多任务环境中的资源管理和协作。 - **并发控制**:死锁、活锁、饥饿等问题的预防和解决策略。 4. **操作系统调度**: - **调度策略**...

    1000个任务和1个任务:有很多任务。 有很多解决方案。 唯一的问题是将它们匹配在一起

    在IT行业中,面对“1000个任务和1个任务”的挑战,我们可以理解这是一...通过goroutine、channel、并发模型、工作池模式以及适当的数据结构和算法,我们可以优雅地解决任务匹配问题,实现大规模任务的并发执行与优化。

    ucos3.0的使用文档

    7. **任务间的通信与同步**:UCOSIII提供了丰富的同步和通信机制,如邮箱、半同步队列等,使得任务间的协作更加灵活高效。 8. **可配置性**:UCOSIII的一大优点是高度可配置,可以根据具体项目需求调整内核选项,如...

    day19_阻塞队列、线程池、File类、递归.pdf

    这种机制保证了线程间的同步和协作,避免了不必要的唤醒和等待操作。 1. **ArrayBlockingQueue**:基于数组实现的有界阻塞队列,队列长度是固定的,遵循先进先出(FIFO)原则。它提供了公平锁和非公平锁的选择,...

    ucos中的任 务.pdf

    任务作为UC/OS-II中的基本执行单元,不仅具有明确的状态划分和优先级设定,还通过丰富的同步和通信机制实现了高效的任务间协作。此外,UC/OS-II的调度策略确保了系统的实时响应能力和资源的有效利用,使其成为嵌入式...

    进程同步-生产者与消费者问题

    生产者与消费者问题是进程同步领域中的一个经典案例,其研究重点在于如何确保多个进程(即生产者和消费者)在共享有限资源的情况下能够正确、高效地进行协作。通过本实验的学习与实践,学生将深入理解进程同步的基本...

    计算机操作系统-司机与售票员的进程问题-实验报告.doc

    实验结果表明,使用信号量可以成功地解决司机与售票员的进程同步问题。 知识点: 1. 进程同步:在操作系统中,进程同步是指多个进程之间的协作和协调。为了避免资源的竞争和死锁,需要使用同步机制来控制进程之间...

Global site tag (gtag.js) - Google Analytics