使用了自己写的log4j拓展显示线程ID的jar包。
运行效果:
写道
[2014-03-27 23:36:20.818][9][com.zwh.log4jtest.Storage][INFO]: producter int <<534, and list is [].+.
[2014-03-27 23:36:21.832][9][com.zwh.log4jtest.Storage][INFO]: producter int <<92, and list is [534].+.
[2014-03-27 23:36:22.847][9][com.zwh.log4jtest.Storage][INFO]: producter int <<30, and list is [534, 92].+.
[2014-03-27 23:36:23.862][8][com.zwh.log4jtest.Storage][INFO]: consumer int is >>534, and list is [92, 30]...
[2014-03-27 23:36:24.877][8][com.zwh.log4jtest.Storage][INFO]: consumer int is >>92, and list is [30]...
[2014-03-27 23:36:25.892][10][com.zwh.log4jtest.Storage][INFO]: consumer int is >>30, and list is []...
[2014-03-27 23:36:26.907][27][com.zwh.log4jtest.Storage][INFO]: producter int <<30, and list is [].+.
[2014-03-27 23:36:27.922][25][com.zwh.log4jtest.Storage][INFO]: producter int <<783, and list is [30].+.
[2014-03-27 23:36:28.937][24][com.zwh.log4jtest.Storage][INFO]: consumer int is >>30, and list is [783]...
[2014-03-27 23:36:29.952][24][com.zwh.log4jtest.Storage][INFO]: consumer int is >>783, and list is []...
[2014-03-27 23:36:30.967][23][com.zwh.log4jtest.Storage][INFO]: producter int <<952, and list is [].+.
[2014-03-27 23:36:31.982][21][com.zwh.log4jtest.Storage][INFO]: producter int <<901, and list is [952].+.
[2014-03-27 23:36:32.997][21][com.zwh.log4jtest.Storage][INFO]: producter int <<93, and list is [952, 901].+.
[2014-03-27 23:36:34.012][20][com.zwh.log4jtest.Storage][INFO]: consumer int is >>952, and list is [901, 93]...
[2014-03-27 23:36:35.027][20][com.zwh.log4jtest.Storage][INFO]: consumer int is >>901, and list is [93]...
[2014-03-27 23:36:36.042][19][com.zwh.log4jtest.Storage][INFO]: producter int <<884, and list is [93].+.
[2014-03-27 23:36:37.057][17][com.zwh.log4jtest.Storage][INFO]: producter int <<418, and list is [93, 884].+.
[2014-03-27 23:36:38.072][17][com.zwh.log4jtest.Storage][INFO]: producter int <<323, and list is [93, 884, 418].+.
[2014-03-27 23:36:39.087][17][com.zwh.log4jtest.Storage][INFO]: producter int <<45, and list is [93, 884, 418, 323].+.
[2014-03-27 23:36:40.102][16][com.zwh.log4jtest.Storage][INFO]: consumer int is >>93, and list is [884, 418, 323, 45]...
[2014-03-27 23:36:21.832][9][com.zwh.log4jtest.Storage][INFO]: producter int <<92, and list is [534].+.
[2014-03-27 23:36:22.847][9][com.zwh.log4jtest.Storage][INFO]: producter int <<30, and list is [534, 92].+.
[2014-03-27 23:36:23.862][8][com.zwh.log4jtest.Storage][INFO]: consumer int is >>534, and list is [92, 30]...
[2014-03-27 23:36:24.877][8][com.zwh.log4jtest.Storage][INFO]: consumer int is >>92, and list is [30]...
[2014-03-27 23:36:25.892][10][com.zwh.log4jtest.Storage][INFO]: consumer int is >>30, and list is []...
[2014-03-27 23:36:26.907][27][com.zwh.log4jtest.Storage][INFO]: producter int <<30, and list is [].+.
[2014-03-27 23:36:27.922][25][com.zwh.log4jtest.Storage][INFO]: producter int <<783, and list is [30].+.
[2014-03-27 23:36:28.937][24][com.zwh.log4jtest.Storage][INFO]: consumer int is >>30, and list is [783]...
[2014-03-27 23:36:29.952][24][com.zwh.log4jtest.Storage][INFO]: consumer int is >>783, and list is []...
[2014-03-27 23:36:30.967][23][com.zwh.log4jtest.Storage][INFO]: producter int <<952, and list is [].+.
[2014-03-27 23:36:31.982][21][com.zwh.log4jtest.Storage][INFO]: producter int <<901, and list is [952].+.
[2014-03-27 23:36:32.997][21][com.zwh.log4jtest.Storage][INFO]: producter int <<93, and list is [952, 901].+.
[2014-03-27 23:36:34.012][20][com.zwh.log4jtest.Storage][INFO]: consumer int is >>952, and list is [901, 93]...
[2014-03-27 23:36:35.027][20][com.zwh.log4jtest.Storage][INFO]: consumer int is >>901, and list is [93]...
[2014-03-27 23:36:36.042][19][com.zwh.log4jtest.Storage][INFO]: producter int <<884, and list is [93].+.
[2014-03-27 23:36:37.057][17][com.zwh.log4jtest.Storage][INFO]: producter int <<418, and list is [93, 884].+.
[2014-03-27 23:36:38.072][17][com.zwh.log4jtest.Storage][INFO]: producter int <<323, and list is [93, 884, 418].+.
[2014-03-27 23:36:39.087][17][com.zwh.log4jtest.Storage][INFO]: producter int <<45, and list is [93, 884, 418, 323].+.
[2014-03-27 23:36:40.102][16][com.zwh.log4jtest.Storage][INFO]: consumer int is >>93, and list is [884, 418, 323, 45]...
代码:
package com.zwh.log4jtest; import java.util.LinkedList; import java.util.Random; import org.apache.log4j.LogManager; import org.apache.log4j.Logger; public class Storage { Logger logger = LogManager.getLogger(Storage.class); LinkedList<Integer> storage = new LinkedList<Integer>(); Random random = new Random(); public synchronized void consume() { if(storage.size() <= 0) { try { wait(); } catch (InterruptedException e) { logger.error(e.getMessage()); } } else { Integer i = storage.remove(); logger.info("consumer int is >>" + i + ", and list is " + storage + "..."); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } notify(); } } public synchronized void product() { if(storage.size() >= 10) { try { wait(); } catch (InterruptedException e) { e.printStackTrace(); } } else { Integer i = random.nextInt(1000); logger.info("producter int <<" + i + ", and list is " + storage + ".+."); storage.add(i); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } notify(); } } public static void main(String[] args) { Storage storage = new Storage(); for(int i = 0;i < 10;i ++) { Consumer consumer = new Consumer(storage); Producter producter = new Producter(storage); consumer.start(); producter.start(); } } } class Consumer extends Thread{ private Storage storage; public Consumer(Storage storage) { this.storage = storage; } @Override public void run() { while(true) { storage.consume(); } } } class Producter extends Thread{ private Storage storage; public Producter(Storage storage) { this.storage = storage; } @Override public void run() { while(true) { storage.product(); } } }
相关推荐
生产者-消费者问题是操作系统中经典的进程同步问题,它模拟了实际生产环境中的资源分配与消耗。在这个问题中,生产者进程负责生成数据并放入有限大小的缓冲区,而消费者进程则从缓冲区取出数据进行消费。为了确保...
在"IPC-model"这个压缩包中,可能包含的代码示例会展示如何定义和初始化这些同步原语,以及如何在生产者和消费者进程中使用它们。例如,可能会有一个全局的缓冲区数组,一个互斥锁用于保护缓冲区的访问,以及一个...
"生产者-消费者"问题是一种经典的多线程同步问题,源于计算机科学中的操作系统领域,用于描述在并发环境中如何协调生产者和消费者之间的操作,确保数据的一致性和避免资源浪费。这个问题的基本设定是有一个共享缓冲...
生产者-消费者问题是多线程编程中的一个经典同步问题,源于操作系统理论,旨在演示如何在多个线程之间安全地共享有限资源。在这个问题中,"生产者"线程负责生成数据,而"消费者"线程则负责处理这些数据。为了确保...
### 操作系统上机实验报告:进程同步和通信——生产者和消费者问题模拟 #### 一、实验目的 本次实验的主要目的是让学生通过调试、修改、运行一个模拟程序,加深对进程概念的理解,熟悉同步和通信的过程,掌握进程...
生产者-消费者问题,也称为缓冲区满/空问题,是多线程编程中的一个经典同步问题。在计算机系统中,生产者线程负责生成数据,而消费者线程则负责处理这些数据。为了协调这两者的操作,通常会有一个共享的缓冲区来存储...
最全的生产者消费者各种实现代码示例,参考学习
实验四、生产者消费者问题(15分) • 一个大小为3的缓冲区,初始为空 • 2个生产者 – 随机等待一段时间,往缓冲区添加数据, – 若缓冲区已满,等待消费者取走数据后再添加 – 重复6次 • 3个消费者 – 随机...
在"consumer_producer.rar"这个文件中,可能包含了一个操作系统模拟实验,通过编程实现生产者-消费者问题的解决方案,可能包括代码示例、分析报告等。通过学习这个案例,你可以深入了解操作系统中进程同步的重要性,...
在Java多线程编程中,消费者-生产者模型是一种经典的线程间通信模式,用于解决多线程环境下的数据共享问题。该模型涉及到两个主要的角色:生产者(Producer)和消费者(Consumer)。生产者负责创建数据,而消费者则...
根据给定的文件信息,以下是对“操作系统实验生产者与消费者实验报告及代码”的详细解析: ### 一、实验背景与目的 本次实验基于Windows操作系统环境,通过利用其提供的API函数来实现进程间的互斥与同步机制。实验...
在这里,我将展示一个使用Java多线程和同步机制来实现的高级功能示例:生产者-消费者模式。 生产者-消费者模式 生产者-消费者模式是一种常见的设计模式,它用于解决生产者(生产数据)和消费者(处理数据)之间的...
生产者-消费者模型是多线程编程中的一个重要概念,它通过解耦生产和消费过程,提高了程序的并发性能和效率...本文提供的代码示例展示了如何使用这些工具来构建生产者-消费者模型,帮助开发者更好地理解和应用这一模型。
虽然示例代码中没有给出具体的消费者实现,但是根据生产者逻辑,我们可以推测消费者的逻辑如下: - 检查缓冲区是否为空。 - 如果缓冲区为空,则通过`WaitForSingleObject(hNotEmptyEvent, INFINITE)`等待,直到缓冲...
在"实验二——生产者消费者"中,可能包含了具体的代码示例或者步骤来演示如何用编程语言实现这个模型,例如使用C++或Java。文件"www.pudn.com.txt"可能是对这个问题的详细解释或参考资料链接,而"实验二——生产者...
4. ** 示例代码**:一个简单的生产者-消费者模型可以通过以下代码示例来理解: ```java import java.util.concurrent.ArrayBlockingQueue; public class ProducerConsumerExample { public static void main...
线程同步是多线程编程中的一个重要概念,用于协调多个并发执行的线程间的数据访问和操作顺序,以避免竞态条件和死锁等问题。...通过MFC框架实现的生产者-消费者示例,我们可以直观地看到线程同步在实际应用中的效果。
这个示例可能使用了上述提到的线程同步机制,并通过创建多个生产者和消费者线程来演示数据的生产和消费过程。通过对这个代码的分析和学习,我们可以更深入地理解多线程同步以及生产者消费者模式在实际应用中的实现...
"生产者-消费者"模式是多线程编程中的一个经典设计模式,它体现了线程间的协作和同步。在这个模式中,"生产者"线程负责创建资源,而"消费者"线程则负责消耗这些资源。这个模式在实际应用中非常常见,例如在消息队列...
在这个场景中,"生产者-消费者(lock和condition).zip"的文件内容可能包含一个使用Java语言实现的示例,它利用了`java.util.concurrent.locks.Lock`接口和`Condition`接口来解决这个问题。 `Lock`接口是Java并发库...