`
GLC
  • 浏览: 112961 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

线程池问题

阅读更多
[size=large]
这道题花了我比较长的时间、总体来讲,现在做出来后、感觉还好。

两条流水线、三个工人,不用想,就是实例化两个生产线程及三个取货线程

首先我们不急着写线程。
先写产品对象:
/**
	 * 生产类
	 */
	static class Producter{
		
		private int number;//产品编号
		
		public void product(){
			
			count++;
			this.setNumber(count);
			System.out.println("进行生产第"+count+"件产品");
		}
		
		public int getNumber() {
			return number;
		}
		public void setNumber(int number) {
			this.number = number;
		}
	}



对了、我们得定义一个全局变量:记录第多少号产品
private static  int count=0;//第几件产品

然后、我们可以写流水线了
/**
	 * 生产线
	 */
	static class ProductThread extends Thread{
		private Queue<Producter> queue;
		
		public ProductThread(Queue<Producter> queue){
			this.queue = queue;
		}
		public void run(){
			while(queue.size()<6){
				
				
					Producter producter = new Producter();
					producter.product();
					queue.add(producter);
					try{
						Thread.sleep(1000);
					}catch(InterruptedException e){
						return;
					}
				}
				
				
				
			}
		}




然后再写工人类






/**
	 * 工人类
	 */
	static class CustomerThread extends Thread{
		private Queue<Producter> queue1;
		private Queue<Producter> queue2;
		private Producter produection;
		public CustomerThread(Queue<Producter> queue1,Queue<Producter> queue2){
			this.queue1 = queue1;
			this.queue2 = queue2;
		}
		
		public void run(){
			while(queue1.size()>0||queue2.size()>0){
				
					//判断应该从哪条线上取
					if(queue1.size()>queue2.size()){
						produection = (Producter)queue1.remove();
					}else{
						produection = (Producter)queue2.remove();
					}
					System.out.println("取下产品第"+produection.getNumber()+"件产品");
					try{
						Thread.sleep(1000);
					}catch(InterruptedException e){
						return;
					}
				}
			
		}



最后主函数中进行生产


/**
	 * 主函数
	 * @param args
	 */
	public static void main(String[] args){
		System.out.println("=============================");
		//存放生产线上的产品数
		Queue<Producter> queue1 = new  ArrayDeque<Producter>();
		Queue<Producter> queue2 = new  ArrayDeque<Producter>();
		
		ProductThread thread1 = new ProductThread(queue1);
		ProductThread thread2 = new ProductThread(queue2);
		thread1.start();
		thread2.start();
		System.out.println("---------------------");
		//三个工人开始取产品
		CustomerThread coustomer1 = new CustomerThread(queue1,queue2);
		coustomer1.start();
		CustomerThread coustomer2 = new CustomerThread(queue1,queue2);
		coustomer2.start();
		CustomerThread coustomer3 = new CustomerThread(queue1,queue2);
		coustomer3.start();
		
		
	}


这样做了之后、我运行发现有问题;生产时、会产生相同编号的产品。
通过查找资料发现,这是因为在生产过程中、没有加同步锁;
现在我们只需要对工人拿产品 及生产线生产产品的地方加同步锁;就解决了这个问题

都是加在while()的条件下synchronized(this){}


最后、源码附上;欢迎大家批评指正
[/size]
分享到:
评论

相关推荐

    MySQL线程池问题1

    MySQL线程池的引入主要是为了解决“每个连接一个线程”模式下的问题,这种模式在处理大量并发连接时可能导致资源浪费和性能瓶颈。Oracle和MariaDB都提供了线程池解决方案,其中Percona移植并优化了MariaDB的线程池...

    threadpool 1.1 支持通用框架的线程池

    对于开发者来说,更新到这个版本可以确保代码的稳定性和性能,减少由于线程池问题导致的系统崩溃或性能下降。 在实际使用线程池时,开发者需要根据应用的特性调整线程池的配置,比如设置合适的最大线程数、核心线程...

    线程池  

    在VC++中实现线程池,需要注意线程同步和互斥的问题,防止数据竞争,确保线程安全。 总之,线程池是提升多线程应用程序性能的关键技术之一,通过合理管理和调度线程,可以优化系统资源的使用,提高整体的运行效率。...

    springmvc+spring线程池处理http并发请求数据同步控制问题

    在这个主题中,我们将深入探讨如何利用Spring MVC与Spring线程池来有效地管理并发请求,并解决数据同步控制问题。 一、Spring MVC与并发处理 1. Spring MVC通过DispatcherServlet接收HTTP请求,然后根据映射规则将...

    Quartz 线程池

    3. **监控与调整**:实时监控 Quartz 的运行状态,如线程池的利用率、任务执行时间等,以便及时发现并解决问题。 ### 五、实战案例 在实际项目中,我们可以利用 Quartz 设计定时任务,例如定期备份数据库、清理...

    简单线程池与线程池检查的实现

    可能涉及网络通信的并发处理,比如服务器端如何利用线程池处理多个客户端的请求,或者如何检查线程池中的网络连接是否健康,防止因网络问题导致的线程阻塞。 总结来说,这个主题涵盖了线程池的基本概念、实现原理...

    一个简单线程池的实现

    在实际应用中,线程池需要考虑的问题包括但不限于: 1. **线程数量控制**:线程池应有一个合理的最大线程数,过多的线程会消耗大量内存,而过少可能无法充分利用多核处理器。 2. **任务调度策略**:线程池可以采用...

    多线程写法(精易模块线程池和鱼刺模块线程池)

    源码分析可以帮助我们更好地掌握如何在实际项目中应用这些线程池,优化代码性能,解决并发问题。 总之,多线程编程是现代软件开发中的重要技能,而线程池是实现高效并发的关键工具。精易模块线程池和鱼刺模块线程池...

    Java实现通用线程池

    线程池的优点是可以提高系统的效率,减少系统的开销,但是需要合理地设置线程池的参数,例如核心线程数、最大线程数和keepAliveTime等参数,否则可能会出现问题。 Java 实现通用线程池是指使用 Java 语言编写一个...

    线程池原理及创建(C++实现)

    ### 线程池原理及创建(C++实现) #### 一、线程池的重要性 在现代计算环境中,网络服务器面临着处理...在设计线程池时,需要考虑线程池的大小、任务队列的管理、线程间的同步等问题,以确保线程池的高效稳定运行。

    windows线程池,使用Windows自带的线程池api功能,比你写的线程池性能好得多

    Windows线程池API的引入主要是为了克服传统线程模型的不足,如频繁创建和销毁线程带来的开销、上下文切换的损耗以及资源竞争等问题。线程池会根据系统状态和任务量动态调整线程数量,从而实现最佳的并发执行效果。 ...

    DELPHI的ThreadPool的线程池DEMO

    - 使用线程池时需确保任务之间无依赖关系,或者正确处理并发访问的数据同步问题。 - 考虑到异常处理,确保线程池中的任务即使出现错误也能被正确地终止。 7. **总结** DELPHI的线程池是实现并发处理的有效工具,...

    java线程池概念.txt

    线程池主要用来解决线程生命周期开销问题和资源不足问题(这段是摘自网络) 2:如何创建一个线程池:   复制代码 public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, ...

    Django异步任务线程池实现原理

    为了解决这个问题,Django采用了异步任务执行的方法。主线程在接收到耗时任务请求后,不会直接处理这个任务,而是将它提交给线程池中的其他线程去执行,主线程则立即返回一个响应给客户端。这样用户就感觉不到任务...

    C++实现的线程池

    线程局部存储(Thread Local Storage,TLS)可以为每个线程提供独立的数据存储区域,避免了使用全局变量带来的并发问题。 7. **异常处理**:线程池需要能够处理任务抛出的异常,防止异常传播导致整个线程池崩溃。...

    Java线程池使用说明

    Java线程池是Java并发编程中的重要组件,它能够有效地管理和复用线程,从而提高程序的执行效率和降低...线程池的使用也应当注意避免资源竞争、线程死锁以及可能的内存泄漏等问题,确保线程安全和高效的并行处理能力。

    易语言线程池操作例程(解决内存不断升高的问题)

    2、线程池则完美的解决了这个问题,线程池的原理就是事先申请好指定数量的线程所使用的资源,而且这些资源是不断的重复利用的!可利用任务管理器看到程序的线程数量的变化(在使用普通的多线程时:线程数会根据软件...

Global site tag (gtag.js) - Google Analytics