Java 生产者消费者与线程池

假设有1000个任务需要处理,第一种方法:将这1000任务加到阻塞队列中,用一个分发线程去将这些任务分发到下面10个子队列中,然后每个子队列有一个线程去消费这些任务。第二种方法:直接新建个线程池,每一个任务都new 一个线程去处理,再把这新建的线程放到线程池中,依靠线程池的机制去等待排队。这两种得到的效果是不是一样的,比如花费的时间,内存之类的,总感觉第二种方式虽然鲁莽,但实际上确实简单可行,第一种方式感觉稍许复杂,但是最后达到的效果和第二种是一样的呀,请教一下这两种有什么优点和缺点。

2个回答

线程池起码没有办法解决以下问题:
(1)跨进程,跨机器,不能跨机器和进程,只能单机,没有什么实用性。
(2)队列容错和恢复,停机怎么办,程序崩溃怎么办。
(3)比较容易死锁,很难调试,而且隔离性差。

所以要用消息队列。当然,你说你就是一个职业学校的课程作业,那就用线程池好了。

你这个明显用Java自带的ThreadPoolExecutor,然后创建一个有界队列,把你的任务添加进去,同时可以控制你的任务线程个数来同时进行任务的处理。
这一个类已经很成熟,可以方便的使用
http://blog.csdn.net/java2000_wl/article/details/22097059

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
线程池实现生产者消费者模型
什么是生产者-消费者模型 某个模块专门负责身缠数据, 可以认为是工厂; 另外一个模块负责对生产的数据进行处理的, 可以认为是消费者. 在生产者和消费者之间加个缓冲区(队列queue实现), 可以认为是商店. 生产者 -----》缓冲区 -----》 消费者 优点: 1). 解耦:生产者和消费者的依赖关系减少; 2). 支持并发;是两个独立的个体, 可并发执行; “”" def creat...
Java 用生产者消费者模型实现线程池
实际编程中经常遇到处理并发的场景,下面是一种用生产者-消费者模型实现的线程池,可以实现并发处理功能。 import java.util.LinkedList; import java.util.Queue; public class WorkerPool { // 线程池Worker数量 private static final int WORKER_COUNT = 10;
(生产者消费者)线程池、 多线程读写线程
接上篇 非阻塞队列ConcurrentLinkedQueue之容器初步学习地 址: http://blog.csdn.net/RD_moon/article/details/77939147如图所示: 1、 DataContainer 容器类上篇博客已有 ; 2、 txt 文本中存在多行数据大概有15万行 ; 3、 运行Startup 类 会将txt文本中的数据通过线程放到容器里,然
python -线程池实现生产者消费者模型
之前我们学过多线程的生产者消费者模型 还以这个判断端口是否可以访问为例: 先生成数据: def create_data(): """创建测试数据, 文件中生成200个IP""" with open('doc/ips.txt', 'w') as f: for i in range(200): f.write('172.25.254.%s\n'...
Java常见面试题汇总-----------Java多线程(线程池、生产者消费者模式实现)
45、线程池ThreadPoolExecutor 45.1、创建线程池   Java通过Executors提供四个静态方法创建四种线程池,分别为:   newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。   newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。  ...
java生产者消费者
java的生产者消费者,thread生产者消费者、。。。。。。
java 生产者消费者
package com.jin; import java.util.LinkedList; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class TestMultipleThread { public static void mai...
生产者消费者 java
生产者消费者 java class Producter extends Thread { Queue q; Producter (Queue q) { this.q=q; } public void run() { for(int i=0;i<10;i++) { q.put(i); System.out.println("producter :"+i); }
Java生产者消费者
package mythreed; /** * 生产者 */ public class Producter implements Runnable { @Override public void run() { synchronized (MainApp.lock) { while (true) { ...
生产者消费者java
生产者消费者程序,用java编写,互斥线程实现方面,欢迎大家指正。
生产者消费者(java)
用java写的生产者消费者问题,有对java感兴趣的话加我QQ381204684
Java - 生产者消费者
生产者和消费者模型基于Lock的生产者消费者模型基于阻塞队列的生产消费者模型 需求: 一个初始值为0,一个加一,一个减1,循环操作 基于Lock的生产者消费者模型 class SharaData { private AtomicInteger number = new AtomicInteger(); private Lock lock = new ReentrantLock();...
JAVA生产者消费者
JAVA实现生产者消费者,操作系统进程通信粒栗子
Java 生产者消费者
public class NewThreadTest { public static void main(String[] args){ Q1 q1 = new Q1(); new Thread(new Producter1(q1)).start(); new Thread(new Consumer1(q1)).start(); }
Java中线程池,原子操作类,阻塞队列(生产者消费者),ThreadLocal
线程池 创建有限的线程资源为更多的任务提供服务,是一种享元模式 ExecutorService接口 java中对线程池的抽象:ExecutorService ExecutorService接口的实现类 : newFixedThreadPool 创建一个固定大小的线程池 //ExecutorService接口是Java 中对线程池的抽象 //submit方法 //Executors工具类 Fix...
多线程之线程池方式--练习生产者消费者模式
虽然Executor是个简单的接口,但它却为灵活且强大的异步任务执行框架提供了基础,该框架能支持多种不同类型的任务执行策略。它提供了一种标准的方法将任务的提交过程与执行过程解耦开来,并用Runnable来表示任务。 Executor基于生产者-消费者模式,提交任务的操作相当于生产者(生成待完成的工作单元),执行任务的线程则相当于消费者(执行完这些工作单元)。如果要在程序中实现一个生产者-消费者的设...
java多线程总结及示例(线程创建、后台线程、volatile、线程池、生产者消费者)...
java基础知识博客: http://blog.csdn.net/touch_2011/article/category/900601
生产者消费者问题(附代码)& 多线程 线程池
生产者消费者问题 浅解(附代码) 多线程 线程池
ThreadPoolExecutor线程池方式实现生产者消费者模式
BlockingQueue定义的常用方法如下 抛出异常 特殊值 阻塞 超时 插入 add(e) offer(e) put(e) offer(e,time,unit) 移除 remove() poll() take() poll(time,unit) 检查 element() peek() 不可用 不可用 1)add(anObject):把anObject加到BlockingQueue里,即如果BlockingQueue可以容纳,则返回true,否则招聘异常
java线程池---编写自己的线程池
java线程池---编写自己的线程池
Java简单线程池 线程池中文文档
简单的线程池程序+中文文档 包结构: com.tangkai.threadpool --SimpleThread.java 工作线程 --TestThreadPool.java 程序入口 --ThreadPoolManager.java 线程池管理类
java线程池(1)初识线程池
java线程池(1)初识线程池       对于用了java很久的程序员来说,java线程池一般都不陌生。但是对于刚开始使用java的人,对java线程池的了解可能就不是那么多充分了。        首先,我来说一下为什么需要线程池,多线程不就可以了吗?什么时候需要我就创建一个线程。不就可以了吗?        如果我们先要了解线程池就必须首先了解线程这个东西!线程是什么? 线程是最小
Java线程-线程池-自定义线程池
自定义线程池,代码如下: public class ThreadExtend_Pool_Custom extends Thread { private String name;//线程的名字 public ThreadExtend_Pool_Custom(String name){ this.name=name; } @Override pu...
Java 常用线程池和自定义线程池
1 通过 Executors 工厂类来创建线程池 创建线程池的方法 newFixedThreadPool 有固定线程数的线程池,如果没有任务执行,那么线程会一直等待 newCachedThreadPool 线程池里有很多线程需要同时执行,老的可用线程将被新的任务触发重新执行,如果线程超过60秒内没执行,那么将被终止并从池中删除 newWorkSt...
java线程池(2)---常见线程池
线程池的创建和使用 生成线程池采用了工具类Executors的静态方法,一下是几种常见的线程池。 SingleThreadExecutor:单个后台线程(其缓冲队列是无界的) public static ExecutorService newSingleThreadExecutor(){ return new FinalizableDelegatedExecutorService...
java线程池原理,常见线程池
java线程池原理 Executors类提供了FixedThreadPool、CachedThreadPool等线程池对象,都是基于ThreadPoolExecutor产生的。 Executor接口定义了execute(),子接口ExecutorService又定义了submit(),抽象类AbstractExecutorService继承了该子接口,调用execute()实现了submit(...
Java线程池之FutureTask【Java线程池系列3】
 Java线程池之FutureTask【Java线程池系列3】 在附录的文章2中,使用了Java的线程池和Future、Callable。本篇文章在文章2的基础上加以改进,基于FutureTask,换掉Future重新实现。 FutureTask既实现了Future,也实现了Runnable,所以更加的普适,用法和Future相类似。和附录的文章2代码写法类似,比如: package
Java线程池
java线程池,作用,使用方法,基本原理
java 线程池
参数: 1.核心线程参数:corePoolSize 2.最大线程数:maximumPoolSize 3.keepAliveTime and unit 线程空闲的时候,存活时间。 4.workQueue 用于存放任务的阻塞队列。 5.handler 当队列和最大线程池都满了之后的饱和策略 ...
Java——线程池
线程池构造: public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, ...
java线程池
常见的创建线程池方式有以下几种: Executors.newCachedThreadPool():无限线程池。 Executors.newFixedThreadPool(nThreads):创建固定大小的线程池。 Executors.newSingleThreadExecutor():创建单个线程的线程池。 其实看这三种方式创建的源码就会发现:     publi...
java 线程池
Executor(father) Executor框架便是Java 5中引入的,其内部使用了线程池机制,它在java.util.cocurrent包下,通过该框架来控制线程的启动、执行和关闭,可以简化并发编程的操作 ExecutorService(father/sun) ExecutorService接口继承自Executor接口,提供了更丰富的实现多线程的方法,用该接口来实现和管...
JAVA线程池
https://blog.csdn.net/qq_25806863/article/details/71126867
【JAVA】线程池
                                                    线程池 1、为什么要创建线程池? (1)创建线程的开销很大 (2)预先建立好线程,有一个固定的预先线程数目,等待任务派发,任务完成后再回到线程池   2、线程池的参数 (1)corePoolSize  初始线程数量 (2)maximumPoolSize     最大允许的线程数量 ...
Java 线程池
系统启动一个线程的成本是比较高,使用线程池可以很好地提高性能,尤其是当程序中需要创建大量生存期很短暂的线程时 线程池在系统启动时即创建大量空闲线程,将一个Runnable、Callable对象—–&gt;传给线程池—–&gt;线程池启动里面的一个线程来执行它们的run()或者call()方法———-&gt;当线程执行体执行完成后,线程并不...
相关热词 c# stream 复制 android c# c#监测窗口句柄 c# md5 引用 c# 判断tabtip 自己写个浏览器程序c# c# 字符串变成整数数组 c#语言编程写出一个方法 c# 转盘抽奖 c#选中treeview