「java线程池类型」java线程池

博主:adminadmin 2023-01-20 02:54:14 361

今天给各位分享java线程池类型的知识,其中也会对java线程池进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

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线程池的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。