【问题标题】:Prioritizing tasks for execution in a Java ThreadPoolExecutor在 Java ThreadPoolExecutor 中优先执行任务
【发布时间】:2014-08-23 06:13:40
【问题描述】:

有没有办法在 Java ThreadPoolExecutor 中优先执行任务?我面临的问题是,当基于相同的指定执行标识符时,需要按顺序执行线程。

它们都被提交到同一个 ThreadPoolExecutor,但由于处理延迟,任务 A2 可能在任务 A1 之前完成(具有相同的执行标识符)。它们应遵循与进入时相同的顺序,同时不阻止其他任务(具有不同的执行标识符)执行(例如 B1、B2、C1 等)。

是否有处理此类问题的通用模式?例如,任务A1、B1、B2、A2、C1进入池进行处理。它们应按以下方式处理:

A1

B1

B2(如果B1已经完成,否则等B1完成,A2或C1轮流执行)

A2(如果A1已经完成,否则等到A1完成,B2如果还没有开始,或者C1轮流)

C1

【问题讨论】:

    标签: java multithreading parallel-processing threadpoolexecutor


    【解决方案1】:

    使用 java.util.concurrent 包而不是线程池。它具有未来的任务,可以帮助您对可操作的项目进行排序和排队。

    http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/package-summary.html

    更新 1:

    您可以使用以下示例。如果我错了,请纠正我,我在 Java FutureTasks 中看到缺少的一件事是链接。在 .NET 中,您可以在单个任务的 Call 方法主体之外链接多个任务并定义依赖项(例如 ContinueWith 和 TaskContinuationOptions、Wait(task) 等)。

    package sample;
    import java.util.concurrent.*;
    
    public class FutureTaskTest {
    
        public static void main(String[] args)
        {
    
             ExecutorService executor = Executors.newFixedThreadPool(3);
    
             final FutureTask<String> a1 = new FutureTask<String>(
                        new Callable<String>()
                        {
                            public String call()
                            {
                               System.out.println("a1 finished.");
                               return "Success";
    
                            }
                        });
    
             FutureTask<String> a2 = new FutureTask<String>(
                        new Callable<String>()
                        {
                            public String call()
                            {
                               try {
                                a1.get();
                            } catch (InterruptedException | ExecutionException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                            }//wait for a1 to finish.
                               System.out.println("a2 finished.");
                               return "Success";
                            }
                        });
             final FutureTask<String> b1 = new FutureTask<String>(
                        new Callable<String>()
                        {
                            public String call()
                            {
                                System.out.println("b1 finished.");
                                return "Success";
                            }
                        });
             FutureTask<String> b2 = new FutureTask<String>(
                        new Callable<String>()
                        {
                            public String call()
                            {
                                try {
                                    b1.get();
                                } catch (InterruptedException | ExecutionException e) {
                                    // TODO Auto-generated catch block
                                    e.printStackTrace();
                                }//wait for b1 to finish.
                               System.out.println("b2 finished.");
                                return "Success";
                            }
                        });
             FutureTask<String> c1 = new FutureTask<String>(
                        new Callable<String>()
                        {
                            public String call()
                            {
                                System.out.println("c1 finished.");
                                return "Success";
                            }
                        });
    
    
             executor.execute(a1);
             executor.execute(a2);
             executor.execute(b1);
             executor.execute(b2);
             executor.execute(c1);
             }
    
    }
    

    这是输出。

    a1 finished.
    b1 finished.
    b2 finished.
    c1 finished.
    a2 finished.
    

    问候卡哈尔

    【讨论】:

    • 感谢您的回复。您能否详细说明在这种情况下如何使用未来的任务?
    【解决方案2】:

    【讨论】:

    • 感谢您的建议。在这种情况下,优先级是在进入队列时确定还是在队列中时确定?例如,如果 B1 仍在处理中,则 B2 应具有低优先级,但如果 B1 已完成,则 B2 应具有高优先级并排在下一个。
    • 嗯 - 我还没有完全阅读你的问题的结尾。不确定是否有一种简单的方法可以实现这一点……使用 3 个单线程执行器,一个用于 As,一个用于 Bs,一个用于 Cs,不是更容易吗?
    • 不是你的错,我搞砸了格式,所以在我的意思之前不是很清楚。就问题本身而言,A/B/C 将是数千个(每个代表一个用户,每个附加的数字代表一个用户操作事件)。我将不得不考虑更多..
    • @heeboir 所以As、Bs和Cs可以独立并行执行,但是As需要按顺序处理(A1先A2再A3),Bs和Cs也一样?
    • 是的,完全正确 - 否则我会遇到外部组件的订购问题..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-13
    • 2020-05-13
    • 1970-01-01
    相关资源
    最近更新 更多