当前位置: 首页 > 知识库问答 >
问题:

java中自定义线程池的实现

燕富
2023-03-14

出于学习的目的,我正在尝试用java实现自己的线程池。下面是我已经实现的。我对这个实现有几个问题:

>

  • 虽然我像内置java一样使用BlockingQueue执行器希望我们提供Runnable对象(通过执行方法)。但在我的情况下,我觉得我可以创建任何对象而不是Runnable。那么为什么Java执行器期望Runnable,我尝试查看源代码,但还不能弄清楚。

    这个原始实现还有什么问题吗?

    请找到密码。

    公共类自定义线程池{

    private final BlockingQueue<Runnable> blockingQueue;
    private final Worker[] workers;
    
    public CustomThreadPool(final int numOfThreads) {
        blockingQueue = new LinkedBlockingQueue<>();
        workers = new Worker[numOfThreads];
    
        for (int i = 0; i < numOfThreads; i++) {
            workers[i] = new Worker();
            workers[i].start();
        }
    }
    
    public void execute(final Runnable task) {
        blockingQueue.add(task);
    }
    
    public void shutdownImmediately() {
        for (int i = 0; i < workers.length; i++) {
            workers[i].shutdownSignal = true;
            workers[i] = null;
        }
    }
    
     private class Worker extends Thread {
        private Runnable taskToPerform = null;
        boolean shutdownSignal = false;
    
        @Override
        public void run() {
            while(true && !shutdownSignal) {
                taskToPerform = blockingQueue.poll();
                if (taskToPerform != null) {
                    taskToPerform.run();
                }
                if(shutdownSignal) {
                    break;
                }
            }
        }
    }
    
    public static void main(String[] args) throws Exception {
        final CustomThreadPool threadPool = new CustomThreadPool(5);
        for (int i = 0; i < 20; i++) {
            threadPool.execute(() -> System.out.println(Thread.currentThread().getName()));
        }
        Thread.sleep(1*1000);
        threadPool.shutdownImmediately();
    }
    

    }

  • 共有1个答案

    公良征
    2023-03-14

    >

  • Executor期望Runnable或Callable,因为它在运行您提交的任务时将调用这些接口的runcall方法。

    在您的实现中,您不使用BlockingQueue的阻塞方面。线程池线程将在上持续旋转(占用cpu时间),而

    您应该使用其中一种阻塞方法,而不是poll()

    您可以使用轮询(long timeout, TimeUnit)方法,该方法需要超时参数。在这种情况下,如果您在任何线程池线程等待此调用时调用您的Shutdown Im权方法。他们将等待超时持续时间,轮询将返回null给他们他们将看到关闭信号正在设置并退出循环。如果您不想让他们等待超时,您也可以调用中断方法。

     // in run method
     try {
         taskToPerform = blockingQueue.poll(5, TimeUnit.SECONDS);
     } catch (InterruptedException e) {
         break; // this thread is interrupted. Time to leave this loop
     }
    
    // in shutdownImmediately method 
    workers[i].shutdownSignal = true;
    // If You don't call interrupt, Threads will wait at max 5 sec for this case.
    workers[i].interrupt(); 
    workers[i] = null;
    

    或者您可以使用take()方法,当队列中没有任何内容时,该方法会进行阻塞。但是在这种情况下,当您调用立即关闭方法时,必须中断可能正在等待take方法调用的线程。否则,他们将无法执行take()调用。

    // in run method
    try {
       taskToPerform = blockingQueue.take();
    } catch (InterruptedException e) {
       break; // this thread is interrupted. Time to leave this loop
    }
    
    // in shutdownImmediately method 
    workers[i].shutdownSignal = true;
    workers[i].interrupt(); // this is crucial for this case
    workers[i] = null;
    

  •  类似资料:
    • SOFARPC 支持自定义业务线程池。可以为指定服务设置一个独立的业务线程池,和 SOFARPC 自身的业务线程池是隔离的。多个服务可以共用一个独立的线程池。 SOFARPC 要求自定义线程池的类型必须是 com.alipay.sofa.rpc.server.UserThreadPool。 XML 方式 如果采用 XML 的方式发布服务,可以先设定一个 class 为 com.alipay.sof

    • 由来 在JDK中,提供了Executors用于创建自定义的线程池对象ExecutorService,但是考虑到线程池中存在众多概念,这些概念通过不同的搭配实现灵活的线程管理策略,单独使用Executors无法满足需求,构建了ExecutorBuilder。 概念 corePoolSize 初始池大小 maxPoolSize 最大池大小(允许同时执行的最大线程数) workQueue 队列,用于存在

    • 问题内容: 是否可以为Java 8 并行流指定自定义线程池?我在任何地方都找不到。 假设我有一个服务器应用程序,并且想使用并行流。但是应用程序很大并且是多线程的,所以我想将其划分。我不希望一个模块中的一个模块中的某个模块运行缓慢,而另一个模块中的任务却运行缓慢。 如果不能为不同的模块使用不同的线程池,则意味着在大多数实际情况下,我不能安全地使用并行流。 请尝试以下示例。在单独的线程中执行一些CPU

    • 我正在编写一个定制的ThreadPoolExecutor,具有以下额外功能:- > 如果有理想的线程,并且随着任务的到来,将该任务分配到队列中,而不是将其添加到队列中。 如果所有线程(最大池大小)都忙,则在新任务到来时,使用RejectionHandler的reject方法将它们添加到队列中 我已经重写了线程池执行程序的java 1.5版本的执行方法。 新守则如下:- 遗留代码如下所示:- 现在正

    • 本文向大家介绍Python自定义线程池实现方法分析,包括了Python自定义线程池实现方法分析的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Python自定义线程池实现方法。分享给大家供大家参考,具体如下: 关于python的多线程,由与GIL的存在被广大群主所诟病,说python的多线程不是真正的多线程。但多线程处理IO密集的任务效率还是可以杠杠的。 我实现的这个线程池其实是根据银角的

    • 是否可以为Java8并行流指定自定义线程池?我到处都找不到它。 如果我不能为不同的模块使用不同的线程池,这就意味着我不能在大多数真实世界的情况下安全地使用并行流。 请尝试以下示例。有些CPU密集型任务在单独的线程中执行。这些任务利用并行流。第一个任务被打破,因此每一步需要1秒(通过线程Hibernate模拟)。问题是其他线程会被卡住,等待中断的任务完成。这是一个虚构的示例,但假设一个servlet