`
帅气的小码农
  • 浏览: 7041 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

利用队列的自动阻塞和线程池来做线程的生产消费

    博客分类:
  • java
 
阅读更多

1.相关实体

package com.royalnu.psis.interfaces.psp.api.model;

import com.royalnu.core.module.com.Identifiable;
import lombok.Getter;
import lombok.Setter;

@Setter
@Getter
public class PspMsg extends Identifiable {
private static final long serialVersionUID = 1L;

    /**
     * <pre>
     * xml内容
     * </pre>
     * 
     */
    private String xmlContent;

    /**
     * <pre>
     * 服务器IP
     * </pre>
     * 
     */
    private String serverIp;

}

 2.定义队列静态属性减少在构造器中传递

package com.royalnu.psis.interfaces.psp.provider.threads;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingQueue;
import com.royalnu.psis.interfaces.psp.api.model.PspMsg;

public class ThreadConstants {
 public static final ExecutorService cachedThreadPool = Executors.newCachedThreadPool(); 
 public static final BlockingQueue<PspMsg> PspMsgQueue = new LinkedBlockingQueue<PspMsg>();
}

 3.生产者

package com.royalnu.psis.interfaces.psp.provider.threads;
import java.util.List;
import javax.annotation.Resource;
import com.royalnu.psis.interfaces.psp.api.model.PspMsg;
import com.royalnu.psis.interfaces.psp.api.service.PspMsgService;
import lombok.extern.log4j.Log4j2;

@Log4j2
public class PspProduceDealThread implements Runnable {

	private List<PspMsg> pspMsgList;
	private boolean isData = true;

	public PspProduceDealThread() {

	}

	public PspProduceDealThread(List<PspMsg> pspMsgList) {
		this.pspMsgList = pspMsgList;

	}

	public void run() {

		while (isData) {
			try {

				for (PspMsg pspMsg : pspMsgList) {
					ThreadConstants.PspMsgQueue.put(pspMsg);
					log.info("生产" + pspMsg.getServerIp());
					Thread.sleep(500L);
				}

			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}
}

 4.消费者

package com.royalnu.psis.interfaces.psp.provider.threads;
import com.royalnu.psis.interfaces.psp.api.model.PspMsg;
import lombok.extern.log4j.Log4j2;

@Log4j2
public final class PspConsumerDealThread implements Runnable {

	public void run() {
		
		while (true) {
			try {
				PspMsg take = ThreadConstants.PspMsgQueue.take();
				log.info("消费" + take.getServerIp());
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		
	}
}

 5.生产消费处理类主要方法

	List<PspMsg> pspMsgList = new LinkedList<PspMsg>();		
			for (int i = 1; i < 10; i++) {
				PspMsg pspMsg = new PspMsg();
				pspMsg.setServerIp(String.valueOf(i));
				pspMsgList.add(pspMsg);
			}
		
			
       PspProduceDealThread produceDealThread = new PspProduceDealThread(pspMsgList);
       ThreadConstants.cachedThreadPool.execute(produceDealThread);

	 PspConsumerDealThread consumerDealThread = new PspConsumerDealThread();
	 ThreadConstants.cachedThreadPool.execute(consumerDealThread);

 

 

1
1
分享到:
评论

相关推荐

    并发-线程池和阻塞队列

    阻塞队列常被用作线程池的工作队列,连接生产者(添加任务的线程)和消费者(执行任务的线程),实现任务的异步处理。 线程池结合阻塞队列,可以构建高效的并发处理框架。例如,当一个新任务被提交到线程池时,它会...

    线程池&&队列各类区别使用场景

    例如,生产者-消费者模型中,阻塞队列能很好地协调生产者和消费者的速率。 线程池与队列结合使用时,可以实现高效的任务调度和资源管理。线程池中的线程从队列中取出任务执行,当队列为空时,线程可能会进入等待...

    并发-线程池和阻塞队列.pdf

    例如,生产者-消费者问题就可以通过阻塞队列来优雅地解决。生产者在队列满时会被阻塞,直到队列有空间时再继续生产;消费者在队列空时也会被阻塞,直到队列中有元素时再继续消费。这种机制避免了传统的wait和notify...

    线程池管理多线程上传

    总结来说,线程池通过统一管理和复用线程,提高了多线程环境下的效率和稳定性。在文件上传场景中,线程池能有效利用系统资源,加速大文件的上传速度,同时通过合理的任务调度和等待机制,确保上传过程的可靠性和一致...

    C#线程池 所有线程运行完毕

    线程池的工作原理是:当任务被提交到线程池时,线程池会根据当前系统负载和已有的线程数量,决定是否立即创建新线程执行任务,或者将任务放入队列等待。线程池会维护一个最小和最大线程数,以保持性能与资源消耗的...

    Android中的线程池与任务队列

    线程池(ThreadPool)是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。线程池可以避免因频繁创建和销毁线程而导致的性能开销,提高系统的资源利用率。在Android中,我们通常...

    BlockingQueue队列自定义超时时间取消线程池任务

    首先,`BlockingQueue`是一个并发容器,它遵循先进先出(FIFO)原则,具有阻塞性质,当队列满时,生产者线程会被阻塞,直到有消费者取走元素;当队列空时,消费者线程会被阻塞,直到生产者放入新的元素。常用实现如`...

    workquere工作队列 多线程

    10. **设计模式**:生产者消费者模式在这里非常适用,生产者(通常是用户界面或其他组件)将任务放入队列,而消费者(后台线程)负责取出并执行任务。 综上所述,这个项目涉及了C#多线程编程的核心概念和技术,包括...

    线程池.zip,互斥锁+条件变量+队列,实现线程池,包括线程池的创建,塞任务,和销毁线程池

    线程池是一种高效的多线程管理机制,它通过预先创建并维护一定数量的工作线程来处理并发任务,避免了频繁创建和销毁线程所带来的开销。在本压缩包"线程池.zip"中,我们可以看到涉及到的核心概念有:线程池、互斥锁、...

    非阻塞线程池框架,管理线程,管理连接

    总之,非阻塞线程池是优化高并发系统的关键技术之一,它通过减少等待时间,提高资源利用率,实现了更高效的线程管理和连接管理。理解并掌握这一技术,对于提升程序性能和编写高并发应用程序至关重要。

    linux C++ 实现线程池(避免线程创建的耗时)

    线程池通过预先创建一组线程来处理任务,避免了频繁地创建和销毁线程带来的开销,从而提高了系统的效率。以下是对这个话题的详细解释。 1. **线程池的概念**:线程池是一组预先创建并处于就绪状态的线程集合,当有...

    支持多线程和泛型的阻塞队列

    阻塞队列是一种在多线程编程中广泛使用的并发数据结构,它在计算机科学和编程领域,特别是Java和C++等面向对象语言中扮演着重要角色。标题中的“支持多线程和泛型的阻塞队列”意味着我们讨论的是一个能够同时处理多...

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

    阻塞队列常用于生产者-消费者模式中,能够实现线程间的协作,保证资源的同步和一致性的操作。 并发队列是支持多线程并发访问的队列。在多线程环境中,多个线程可能会同时对同一个队列进行操作,如同时入队或出队,...

    多线程 队列利用

    5. **生产者-消费者模型**:这是多线程和队列结合的经典应用,生产者负责填充队列,消费者负责消耗队列中的任务,队列充当两者之间的缓冲区。 6. **线程池与队列**:线程池中,任务会被放入一个工作队列,线程从...

    多线程编程线程池

    在计算机科学领域,多线程编程是一种广泛采用的技术,旨在通过同时处理多个任务来提高应用程序的性能和响应速度。然而,创建和销毁线程的过程是相对昂贵的,尤其是在处理大量短暂运行的任务时。为了克服这一挑战,...

    多线程的使用-一个线程池的Demo

    线程池不仅可以提高系统资源利用率,还能简化并发编程的复杂性,通过统一的接口管理和调度线程,降低线程的创建和销毁成本,提升程序性能。在多任务环境中,线程池能够根据系统负载动态调整工作线程的数量,实现更...

    TheadPool 线程池源码 自动管理线程的创建和销毁

    本文将基于提供的"ThreadPool.cpp"和"ThreadPool.h"文件,深入解析线程池的实现原理及其自动管理线程创建和销毁的机制。 1. **线程池的概念** 线程池是一组预先创建的线程,这些线程等待任务的到来并进行处理。当...

    java多线程加队列上传文件_后台处理

    该系统通过创建多个线程来并行处理客户端的文件上传请求,同时利用队列结构来协调任务的调度与执行。 #### 关键技术点 1. **多线程设计**:在Java中,多线程是通过`Thread`类或实现`Runnable`接口来实现的。本案例...

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

    在实际应用中,队列的变种如循环队列、阻塞队列和并发队列在多线程编程、并发系统和操作系统中有着广泛的应用。例如,Disruptor是一个高性能的消息队列,利用循环队列实现零拷贝和最小锁竞争;Linux的环形缓存使用了...

    Java中的线程与线程池.pptx

    因此,推荐自定义配置线程池,如使用有界队列ArrayBlockingQueue,并合理设定核心线程数、最大线程数和拒绝策略,以确保线程池稳定且高效地运行。 总之,理解Java中的线程和线程池原理,以及如何正确使用它们,对于...

Global site tag (gtag.js) - Google Analytics