Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在Java中指定任务顺序执行

在Java中指定任务顺序执行
EN

Stack Overflow用户
提问于 2012-10-04 07:37:31
回答 2查看 6.9K关注 0票数 14

我已经搜索了很多,但找不到任何解决方案。我以这样的方式使用java线程池:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ExecutorService c = Executors.newFixedThreadPool(3);
for (int i = 0; i < 10; ++i) {
  c.execute(new MyTask(i));
}

这样,任务就按顺序执行(就像在队列中一样)。但我需要改变“选择下一个任务”的策略。因此我希望为每个任务指定优先级(它不是线程优先级),并执行与这些优先级相对应任务。因此,当执行程序完成另一个任务时,它选择下一个任务作为具有最高优先级的任务。它描述了常见问题。也许有一种更简单的方法,不考虑优先级。它选择最后添加的任务作为下一个要执行的任务,而不是第一个添加的任务。粗略地说,FixedThreadPool使用先进先出策略。例如,我可以使用后进先出策略吗?

EN

回答 2

Stack Overflow用户

发布于 2012-10-04 07:52:31

您可以使用PriorityBlockingQueue指定要执行ThreadPoolExecutor的队列。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class PriorityExecutor extends ThreadPoolExecutor {

    public PriorityExecutor(int corePoolSize, int maximumPoolSize,
            long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue) {
        super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue);
    }
    //Utitlity method to create thread pool easily
    public static ExecutorService newFixedThreadPool(int nThreads) {
        return new PriorityExecutor(nThreads, nThreads, 0L,
                TimeUnit.MILLISECONDS, new PriorityBlockingQueue<Runnable>());
    }
    //Submit with New comparable task 
    public Future<?> submit(Runnable task, int priority) {
        return super.submit(new ComparableFutureTask(task, null, priority));
    }
    //execute with New comparable task 
    public void execute(Runnable command, int priority) {
        super.execute(new ComparableFutureTask(command, null, priority));
    }
}

定义要按优先级进行比较的ComparableFutureTask

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class ComparableFutureTask<T> extends FutureTask<T>
        implements
            Comparable<ComparableFutureTask<T>> {

    volatile int priority = 0;

    public ComparableFutureTask(Runnable runnable, T result, int priority) {
        super(runnable, result);
        this.priority = priority;
    }
    public ComparableFutureTask(Callable<T> callable, int priority) {
        super(callable);
        this.priority = priority;
    }
    @Override
    public int compareTo(ComparableFutureTask<T> o) {
        return Integer.valueOf(priority).compareTo(o.priority);
    }
  }
票数 12
EN

Stack Overflow用户

发布于 2012-10-04 08:05:25

ThreadPoolExecutor构造函数接受BlockingQueue。您可以将queue作为PriorityBlockingQueue进行传递。它不会在排序时生成任何被授权者,您需要传递自定义比较器来维护顺序。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
static BlockingQueue<Task> queue=new PriorityBlockingQueue<Task>(MAXPOOL,new TaskComparator());

static ThreadPoolExecutor threadpool = new ThreadPoolExecutor(30, MAXPOOL, 
        MAXPOOL, TimeUnit.SECONDS, (PriorityBlockingQueue) queue, new mThreadFactory());



class TaskComparator implements Comparator<Task>{
  public int compare(Task t1, Task t2){
    //write you own logic to compare two task.
  }
}
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12722396

复制
相关文章
子串和
给定一整型数列{a1,a2...,an},找出连续非空子串{ax,ax+1,...,ay},使得该子序列的和最大,其中,1<=x<=y<=n。
书童小二
2018/09/03
5430
leetcode最长回文子串_最长回文子串算法
作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处
全栈程序员站长
2022/11/03
8030
回文子串
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
喜欢ctrl的cxk
2019/11/08
4100
字符串中查找子串_cstring查找子字符串
假设要从主串 s = “goodgoogle” 中找到 t = “google” 子串。根据我们的思考逻辑,则有:
全栈程序员站长
2022/09/24
3K0
字符串中查找子串_cstring查找子字符串
最长公共子串 / 子序列
本文记录寻找两个字符串最长公共子串和子序列的方法。 名词区别 最长公共子串(Longest Common Substring)与最长公共子序列(Longest Common Subsequence)的区别: 子串要求在原字符串中是连续的,而子序列则只需保持相对顺序,并不要求连续。 最长公共子串 是指两个字符串中最长连续相同的子串长度。 例如:str1=“1AB2345CD”,str2=”12345EF”,则str1,str2的最长公共子串为2345。 动态规划 如果 str1 的长度为
为为为什么
2022/08/10
4.6K0
最长公共子串 / 子序列
18:验证子串
18:验证子串 总时间限制: 1000ms 内存限制: 65536kB描述 输入两个字符串,验证其中一个串是否为另一个串的子串。 输入输入两个字符串, 每个字符串占一行,长度不超过200且不含空格。输出若第一个串s1是第二个串s2的子串,则输出(s1) is substring of (s2)  否则,若第二个串s2是第一个串s1的子串,输出(s2) is substring of (s1)  否则,输出 No substring。样例输入 abc dddncabca 样例输出 abc is
attack
2018/04/03
1.5K0
回文子串的个数_统计回文子串的个数
(1)从左往右,钉住最后一个字符。 “abaa”串:先考查中心子串“ba”不是回文串,就可以判定“abaa”不是回文子串; “baa”串:先考查中心子串“baa”不是回文,它是最外子串,不必向外扩散; “aa”串:考查中心子串中“aa”是回文,它是最外子串,不必向外扩散。 (2)从右边倒数第二个字符往左,钉住第一个字符。 “aba”串:考查中心子串“aba”,是回文,它是最外子串,不必向外扩展; “ab”串:考查子串“ab”,不是回文,它是最外子串,不必向外扩展; 这样下来,加上单个子串“a”,“b”,“a”,“a”4个,“abaa”中共包含6个回文子串。 1.2、输入描述 输入数据中有多个测试案例。每个案例是一个非空且长度不超过5000的字符串。 处理到文件结尾。 1.3、输出描述 在每行上打印该字符串中回文子串的个数。 1.4、输入样例 aba aa 1.5、输出样例 4 3 2、C++实现 #include <iostream> using namespace std; int main(int argc, char* argv[]) { char s[5000]; int p, i, Half, Left, Right, Count; while( cin>>s ) { i = strlen(s); Count = 0; //从左到右钉住最后一个 for(p=0; p<=i-1; p++) { Half = ((i-1)-p) / 2; //如果子串是奇数个 if( ((i-1)-p)%2 == 0 ) { Left = p + Half - 1; Right = p + Half + 1; } else { //如果子串是偶数个 Left = p + Half; Right = p + Half + 1; } while(Left >= p) { if( s[Left] == s[Right]) { Count++; //发现了一个回文串 Left--; Right++; } else { //如果不相等,立即终止,由中心向外扩散不可能会有回文串 break; } } } //从右到左钉住第一个 for(p=i-2; p>=1; p--) { Half = p / 2; //如果子串是奇数个 if(p%2 == 0) { Left = Half - 1; Right = Half + 1; } else //如果子串是偶数个 { Left = Half; Right = Half + 1; } while( Left >= 0 ) { if( s[Left] == s[Right] ) { Count++; //发现了一个回文串 Left--; Right++; } else { //如果不相等,立即终止,由中心向外扩散不可能会有回文串 break; } } } printf("%d\n",Count + i); } return 0; }
全栈程序员站长
2022/11/03
1.2K0
回文子串的个数_统计回文子串的个数
34:回文子串
34:回文子串 总时间限制: 1000ms 内存限制: 65536kB描述 给定一个字符串,输出所有长度至少为2的回文子串。 回文子串即从左往右输出和从右往左输出结果是一样的字符串,比如:abba,cccdeedccc都是回文字符串。 输入一个字符串,由字母或数字组成。长度500以内。输出输出所有的回文子串,每个子串一行。 子串长度小的优先输出,若长度相等,则出现位置靠左的优先输出。样例输入 123321125775165561 样例输出 33 11 77 55 2332 2112 5775
attack
2018/04/03
1.4K0
python最长回文子串动态规划_最长回文子串问题
遍历子串的复杂度是O(n^2),判断是不是回文串的复杂度是O(n),所以这个算法的复杂度是O(n^3)。
全栈程序员站长
2022/09/05
1.5K0
最长回文子串
class Solution { public: string longestPalindrome(string s) { if (s.size()==1 || !s.size()) return s; if (s.size()==2 && s[0]==s[1]) return s; int n = s.siz(); vector<vector<bool>> f(n, vector<bool>(n)); // 记录子串的起始索引和长度 int start=0,len=1; fo
lexingsen
2022/02/25
5520
最长回文子串
给你一个字符串 s,找到 s 中最长的回文子串。啥是回文串?就是字符可以看成是对称的,从左往右读和从右往左读是一样意思,比如:上海自来水来自海上。来看下下面的示例:
用户4456933
2021/06/01
6370
扩展kmp求最长回文子串_算法-字符串之最长回文子串
首先介绍一下什么叫回文串,就是正着读和倒着读的字符顺序都是一样的,eg:level,noon。而回文子串,顾名思义,就是主串中满足回文性质的子串。
全栈程序员站长
2022/08/23
8350
最长公共子串
思路一,利用动态规划的方法,列出全部结果来寻找规律,我们发现45度下滑,如果连续相等的话我们可以做递加,不但可以得出最长的字符串数量还可以知道字符的位置。
忧愁的chafry
2022/10/30
4820
最长公共子串
DS串应用—最长重复子串
求串的最长重复子串长度(子串不重叠)。例如:abcaefabcabc的最长重复子串是串abca,长度为4。
叶茂林
2023/07/30
2830
删除字符串中的子串
输入2个字符串S1和S2,要求删除字符串S1中出现的所有子串S2,即结果字符串中不能包含S2。
叶茂林
2023/07/28
2870
删除字符串中的子串
#103. 子串查找
内存限制:256 MiB时间限制:500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论测试数据 题目描述 这是一道模板题。 给定一个字符串 A AA 和一个字符串 B BB,求 B BB 在 A AA 中的出现次数。 A AA 中不同位置出现的 B BB 可重叠。 输入格式 输入共两行,分别是字符串 A AA 和字符串 B BB。 输出格式 输出一个整数,表示 B BB 在 A AA 中的出现次数。 样例 样例输入 zyzyzyz zyz 样例输出 3 数据范围与
attack
2018/04/12
1.3K0
LeetCode - 最长回文子串
同样是三年前做的一道题目,很经典的字符串领域的算法题,求字符串的最长回文子串,当时我也是提交了好几次,并且看了相关的资料以后,才成功通过。
晓痴
2019/07/24
6760
LeetCode - 最长回文子串
最长公共子串
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
喜欢ctrl的cxk
2019/11/08
7760
本期题目:连续子串
给你两个字符串t和p 要求从t中找到一个和p相同的连续子串 并输出该子串第一个字符的下标
梦想橡皮擦
2023/04/21
2260
647. 回文子串
给定一个字符串,你的任务是计算这个字符串中有多少个回文子串。 具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被视作不同的子串。 示例 1: 输入:"abc" 输出:3 解释:三个回文子串: "a", "b", "c" 示例 2: 输入:"aaa" 输出:6 解释:6个回文子串: "a", "a", "a", "aa", "aa", "aaa" class Solution { public int countSubstrings(Stri
CaesarChang张旭
2021/06/01
2820

相似问题

PHP5中简单而强大的图表库

40

简单的独立网站检查工具

40

强大而简单的在.NET中实现加密技术?

23

用于故障转移IIS服务的强大而准确的IIS报告工具

10

强大的windows计算器工具?

41
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文