「java线程池类型」java线程池
今天给各位分享java线程池类型的知识,其中也会对java线程池进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!
本文目录一览:
- 1、java 分布式并发控制一般用什么线程池
- 2、java 定义一个线程池 循环遍历list,进行读写操作
- 3、java 线程池机制的原理是什么?
- 4、Java多线程为什么使用线程池
- 5、java for循环中创建线程池
java 分布式并发控制一般用什么线程池
一般多条线程并行的时候管理多条线程就使用线程池,如服务器端处理多个客户端的请求
java 定义一个线程池 循环遍历list,进行读写操作
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
/**
* 并发处理器
* 适用于如下场景(举例):
* 一个任务队列, 有150个任务需要并发处理,使用此对象,可以每次并发执行20次(可设置),则总共串行执行8次并发,可获取执行结果
*
* @param T 类型T限制为任务Callable使用的数据对象和返回结果的数据对象为同一个bean
*/
public class ConcurrentExcutorT
{
/** 非空,所有任务数组 */
private CallableT[] tasks;
/** 非空,每次并发需要处理的任务数 */
private int numb;
/** 可选,存放返回结果,这里有个限制,泛型T必须为Callable返回的类型T */
private ListT result;
/**
* 无参构造
*/
public ConcurrentExcutor()
{
super();
}
/**
* 不需要返回结果的任务用此创建对象
* @param tasks
* @param numb
*/
public ConcurrentExcutor(CallableT[] tasks, int numb)
{
super();
this.tasks = tasks;
this.numb = numb;
}
/**
* 需要结果集用此方法创建对象
* @param tasks
* @param numb
* @param result
*/
public ConcurrentExcutor(CallableT[] tasks, int numb, ListT result)
{
super();
this.tasks = tasks;
this.numb = numb;
this.result = result;
}
public void excute()
{
// 参数校验
if(tasks == null || numb 1)
{
return;
}
// 待处理的任务数
int num = tasks.length;
if(num == 0)
{
return;
}
// 第一层循环,每numb条数据作为一次并发
for(int i=0; i(int)Math.floor(num/numb) + 1; i++)
{
// 用于记录此次numb条任务的处理结果
Future[] futureArray;
if(numb num)
{
futureArray = new Future[num];
}
else
{
futureArray = new Future[numb];
}
// 创建线程容器
ExecutorService es = Executors.newCachedThreadPool();
// 第二层循环,针对这numb条数据进行处理
for(int j=i*numb; j(i+1)*numb; j++)
{
// 如果超出数组长度,退出循环
if(j + 1 num)
{
break;
}
// 执行任务,并设置Future到数组中
futureArray[j%numb] = es.submit(tasks[j]);
}
// 将结果放入result中
if (result != null)
{
for (int j = 0; j futureArray.length; j++)
{
try
{
if(futureArray[j] != null)
{
Object o = futureArray[j].get();
result.add((T)o);
}
}
catch (InterruptedException e)
{
System.out.println("处理Future时发生InterruptedException异常,目标Future为: " + futureArray[j].toString());
e.printStackTrace();
}
catch (ExecutionException e)
{
System.out.println("处理Future时发生ExecutionException异常,目标Future为: " + futureArray[j].toString());
e.printStackTrace();
}
}
}
es.shutdown();
}
}
java 线程池机制的原理是什么?
线程池属于对象池.所有对象池都具有一个非常重要的共性,就是为了最大程度复用对象.那么线程池的最
重要的特征也就是最大程度利用线程.
首先,创建线程本身需要额外(相对于执行任务而必须的资源)的开销.
作业系统在每创建一个线程时,至少需要创建以下资源:
(1) 线程内核对象:用于对线程上下文的管理.
(2) 用户模式执行栈.
(3) 内核模式执行栈.
这些资源被线程占有后作业系统和用户都无法使用.
相反的过程,销毁线程需要回收资源,也需要一定开销.
其次,过多的线程将导致过度的切换.线程切换带来的性能更是不可估量.系统完成线程切换要经过以下过程:
(1) 从用户模式切换到内核模式.
(2) 将CPU寄存器的值保存到当前线程的内核对象中.
(3)打开一个自旋锁,根据调度策略决定下一个要执行的线程.释放自旋锁,如果要执行的线程不是同一进
程中的线程,还需要切换虚拟内存等进程环境.
(4) 将要执行的线程的内核对象的值写到CPU寄存器中.
(5) 切换到用户模式执行新线程的执行逻辑.
所以线程池的目的就是为了减少创建和切换线程的额外开销,利用已经的线程多次循环执行多个任务从而提
高系统的处理能力.
Java多线程为什么使用线程池
1:提高效率 创建好一定数量的线程放在池中,等需要使用的时候就从池中拿一个,这要比需要的时候创建一个线程对象要快的多。
2:方便管理 可以编写线程池管理代码对池中的线程统一进行管理,比如说系统启动时由该程序创建100个线程,每当有请求的时候,就分配一个线程去工作, 如果刚好并发有101个请求,那多出的这一个请求可以排队等候,避免因无休止的创建线程导致系统崩溃
java for循环中创建线程池
首先要明确线程池的意思,就是线程预先创建好放在一个池里面,使用后不会销毁
要区分任务和线程池,任务可以不断添加,但是线程池里线程的个数是固定的,当任务数超过线程数后,后面的任务需要等待有空闲的线程才会执行
所以不断添加任务没有关系,如果池中有50个线程,你添加100个任务同一时间也只会执行50个任务,剩下的50个任务需要等待前面的任务执行完毕后继续执行
所以你的主线程原则上可以不断for,但是你总得有个结束点吧
关于java线程池类型和java线程池的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。