关于线程池的小想法

问题描述

首先 吾辈先声明下 吾辈是菜菜, 所以大湿们觉得的那里说错了 尽量喷~~今天早上 吾辈蛋疼的看了下 Excutors 的源代码, 又看了下以前用到线程池的一些方法, 发现了一个小问题吾辈一直是先弄出个线程池, 然后玩命的在线程池里面死命的塞对象ExecutorService pool = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors() + 1);pool.submit(new xRunnable()); : :pool.shutdown();while (true) {if(pool.isTerminated())break;TimeUnit.SECONDS.sleep(2);}线程池的主要目的是减少线程创建与销毁的时间吧? && 资源的创建与销毁然后吾辈又想了 new xRunnable() 的时候 应该会创建很多资源吧 比如很多Map啊, 一些Bo啊 什么的?(为了线程安全 很多资源 咱都是 new 出来了 吾辈又不怎么热衷于同步的方法, 总是感觉 线程一多, 同步会大大的影响效率)问题1: 各位大湿是怎么处理线程安全的啊??吾辈想了: 那些对象什么的 用完后没有必要被销毁掉, 重新初始化下 应该能继续用吧. 然后咱就这样想了: 把那些xRunnable要用到的资源封装成一个对象, (就叫其"资源库"吧) 然后创建一个与线程大小相同的资源库数组, 当要运行xRunnable时候 将其注入到 xRunnable 对象中. 而需要拿到那个资源库, 根据线程ID 应该可以判断吧, 反正线程结束 资源库的使命也完成了.问题2: 各位大湿吾辈这样的想法有问题么??可以能吾辈比较纠结吧 所以没事的时候会钻牛角尖~~问题3: 咱找了好久, 但是没发现Java的线程池是否可以重写下run的时候的方法问题补充NanguoCoffee 写道

解决方案

这个, 你的资源库要是能 放取自如 一切就ok了. 问题就会卡在这吧.. 你可以试试. 我以前觉得访问对象 总是new 也慢 也想过 我叫 对象池 不过没实现
解决方案二:
嘿嘿,俺发现很多人一提到多线程就要用到线程同步,这样还不如不用多线程,直接用个队列+单线程来处理数据,这样还快些。多线程的话,需要清楚的知道自己的程序各个线程之间是否会有共享变量同时访问的情况,如果有就得同步一下,如果没有就别用同步浪费性能了。JVM的内存模型分为线程空间和主存空间。当你启动一个线程的时候,jvm会把主存空间里面的数据copy到线程空间里面去,就是那些共享变量啦(线程运行时需要的外部数据,这样来说贴切些)。这个时候jvm里面就会有2份数据的copy。主存空间里面的数据是对所有线程可见的。而线程空间的数据只对他自己的线程可见。当线程运行完以后又会把线程空间里面的数据copy到主存空间去,同时销毁线程空间里面的所有数据。这样解释以后你就清楚多线程到底危险在什么地方了,呵呵。
解决方案三:
你又没同步干吗担心同步会效率慢不过多多思考问题对自己会有好处的。做之前就能意识到问题的是架构师做完之后能发现问题的叫高级程序员做完之后还不能意识到问题的就只能做一辈子的程序员鸟
解决方案四:
1: 要啥资源库呀。 要么重新new一个,要么复用已有的2: 真够钻牛角尖3: 没事你修改run的方法干嘛? 要修改就自己写个线程池得了

时间: 2024-07-29 20:30:48

关于线程池的小想法的相关文章

多线程之线程池概述(一)

java在JDK1.5之后引入了并发计算框架,java.util.concurrent.这个框架大大减轻了简化了多线程的开发工作.一个线程大概有五种状态:新建状态(New).可运行状态(Runnable,也叫做运行状态).阻塞状态(Blocked).等待状态(Waiting).结束状态(Terminated).线程的状态只能由新建转变为了运行状态后才能被阻塞或者等待状态.线程的状态流转如图所示: 注意:这里把等待状态给细分了一下.把等待状态分为了等待池和等锁池. 线程的运行时间可以分为三个部分:

线程池的使用(第八章)

线程池的使用 Executor框架可以将任务的提交与任务的执行策略解耦开来. 并非所有的任务都使用所有的执行策略,有些任务需要明确的指定执行策略,包括: 1. 依赖性任务:提交给线程池的任务需要依赖其他的任务,那么就隐含地给执行策略带来了约束,此时必须小心地维持这些执行策略以避免产生活跃性问题 2. 使用线程封闭机制的任务:单线程的Executor能够对并发性做出更强的承诺,对象可以封闭在任务线程中,使得在该线程中执行的任务在访问该对象时不需要同步,即使这些资源不是线程安全的也没有问题.但这种情

tomcat网站的小问题,有关线程池

问题描述 我需要在服务器端一直维护一个线程池,用来专门处理用户提交的某一类型请求请问线程池的创建应该放在哪里?是写在监听方法contextInitialized中还是像数据库连接池一样写在配置文件中?应该怎么写再就是这种线程池一般是用java自带的还是tomcat的还是自己写比较好 解决方案 解决方案二:自己顶一个...怎么没人回答呢解决方案三:线程池主要目的是什么?为什么一定要和当前项目绑定启动?(是否可以单独作为后台部署)解决方案四:比如说网站做一个评测系统,每提交一个请求,我就要运行一个评

java concurrent包自带线程池和队列详细讲解

Java线程池使用说明一简介线程的使用在java中占有极其重要的地位,在jdk1.4极其之前的jdk版本中,关于线程池的使用是极其简陋的.在jdk1.5之后这一情况有了很大的改观.Jdk1.5之后加入了java.util.concurrent包,这个包中主要介绍java中线程以及线程池的使用.为我们在开发中处理线程的问题提供了非常大的帮助.二:线程池线程池的作用:线程池作用就是限制系统中执行线程的数量.     根据系统的环境情况,可以自动或手动设置线程数量,达到运行的最佳效果:少了浪费了系统资

100行Java代码构建一个线程池

在现代的操作系统中,有一个很重要的概念――线程,几乎所有目前流行的操作系统都支持线程,线程来源于操作系统中进程的概念,进程有自己的虚拟地址空间以及正文段.数据段及堆栈,而且各自占有不同的系统资源(例如文件.环境变量等等).与此不同,线程不能单独存在,它依附于进程,只能由进程派生.如果一个进程派生出了两个线程,那这两个线程共享此进程的全局变量和代码段,但每个线程各拥有各自的堆栈,因此它们拥有各自的局部变量,线程在UNIX系统中还被进一步分为用户级线程(由进程自已来管理)和系统级线程(由操作系统的调

C实现一个简单的线程池

//threadpool.h #ifndef __THREADPOOL_H__ #define __THREADPOOL_H__ #include <pthread.h> typedef void* (*task_fun)(void*); //用链表来维护等待任务 typedef struct threadtask { //任务的执行函数 task_fun task; //执行函数的参数 void* arg; //下一节点 struct threadtask* next; }THREAD_TA

ava实现线程池原理:适用于电商网站之类的交互频繁的网站

线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务.线程池线程都是后台线程.每个线程都使用默认的堆栈大小,以默认的优先级运行,并处于多线程单元中.如果某个线程在托管代码中空闲(如正在等待某个事件),则线程池将插入另一个辅助线程来使所有处理器保持繁忙.如果所有线程池线程都始终保持繁忙,但队列中包含挂起的工作,则线程池将在一段时间后创建另一个辅助线程但线程的数目永远不会超过最大值.超过最大值的线程可以排队,但他们要等到其他线程完成后才启动. 组成部分 1.线程池

Java创建线程池两种不同方法的比较

用java做抓取的时候免不了要用到多线程的了,因为要同时抓取多个网站或一条线程抓取一个网站的话实在太慢,而且有时一条线程抓取同一个网站的话也比较浪费CPU资源.要用到多线程的等方面,也就免不了对线程的控制或用到线程池.   我在做我们现在的那一个抓取框架的时候,就曾经用过java.util.concurrent.ExecutorService作为线程池,关于ExecutorService的使用代码大概如下: java.util.concurrent.Executors类的API提供大量创建连接池

JAVA创建线程池

线程池的作用: 线程池作用就是限制系统中执行线程的数量. 根据系统的环境情况,可以自动或 手动设置线程数量,达到运行的最佳效果:少了浪费了系统资源,多了造成系统拥挤效率不高.用线程池控制 线程数量,其他线程排队等候.一个任务执行完毕,再从队列的中取最前面的任务开始执行.若队列中没有等 待进程,线程池的这一资源处于等待.当一个新任务需要运行时,如果线程池中有等待的工作线程,就可以开 始运行了:否则进入等待队列. 为什么要用线程池: 减少了创建和销毁线程的次数,每个工作 线程都可以被重复利用,可执行