java 中的 Executorservice 如何工作?
How Executorservice works in java?
我对传统的线程实现很熟悉,但对ExecutorService不太了解。我知道使用执行程序服务处理线程时非常方便。但我对它的实现有点困惑。
假设我有一个父 thread/main 线程和一个最大线程池大小为 10 的执行程序服务。现在我只想在大小小于 1000 的 jms 队列上执行某个任务。所以现在我可能会想到用两种方式来实现它。
案例 1:
class MyThreadClass inmplements Runnable {
public static void main(String args[]){
while(true){
int checkQueueSize = jmsQueue.getSize();
while(checkQueueSize<1000){
threadPoolTaskExecutor.execute(this);
++checkQueueSize;
}
}
}
public void run(){
jmsQueue.pushMessage("Hello Thread");
}
}
案例2:
class MyThreadClass inmplements Runnable {
public static void main(String args[]){
threadPoolTaskExecutor.setWaitForTasksToCompleteOnShutdown(true);
threadPoolTaskExecutor.execute(this);
}
public void run(){
while(true){
int checkQueueSize = jmsQueue.getSize();
while(checkQueueSize<1000){
jmsQueue.pushMessage("Hello Thread");
++checkQueueSize;
}
}
}
}
我的理解是情况 2 不会跨越多个线程。我是否正确?或者有其他方法可以完成任务吗?
"case 2 will not span more than one thread" 是的。这是对的。因为你只调用了一次execute
。
在第一种情况下,您可能会多次调用 execute
。如果之前的任务未完成,将运行额外的线程。
请找到我的代码:-
class MyThreadClass inmplements Runnable {
public static void main(String args[]){
threadPoolTaskExecutor.setWaitForTasksToCompleteOnShutdown(true);
for(int i=0;i<10;i++)
threadPoolTaskExecutor.execute(this);
}
public void run(){
while(true){
int checkQueueSize = jmsQueue.getSize();
if(checkQueueSize<=1000){
jmsQueue.pushMessage("Hello Thread");
}
}
}
}
修改:-
- 创建 10 个线程并通过传递 Runnable class 对象将它们分配给 运行 作业。
- 删除不必要的 while 循环作为执行无限迭代的外循环。
我对传统的线程实现很熟悉,但对ExecutorService不太了解。我知道使用执行程序服务处理线程时非常方便。但我对它的实现有点困惑。
假设我有一个父 thread/main 线程和一个最大线程池大小为 10 的执行程序服务。现在我只想在大小小于 1000 的 jms 队列上执行某个任务。所以现在我可能会想到用两种方式来实现它。
案例 1:
class MyThreadClass inmplements Runnable {
public static void main(String args[]){
while(true){
int checkQueueSize = jmsQueue.getSize();
while(checkQueueSize<1000){
threadPoolTaskExecutor.execute(this);
++checkQueueSize;
}
}
}
public void run(){
jmsQueue.pushMessage("Hello Thread");
}
}
案例2:
class MyThreadClass inmplements Runnable {
public static void main(String args[]){
threadPoolTaskExecutor.setWaitForTasksToCompleteOnShutdown(true);
threadPoolTaskExecutor.execute(this);
}
public void run(){
while(true){
int checkQueueSize = jmsQueue.getSize();
while(checkQueueSize<1000){
jmsQueue.pushMessage("Hello Thread");
++checkQueueSize;
}
}
}
}
我的理解是情况 2 不会跨越多个线程。我是否正确?或者有其他方法可以完成任务吗?
"case 2 will not span more than one thread" 是的。这是对的。因为你只调用了一次execute
。
在第一种情况下,您可能会多次调用 execute
。如果之前的任务未完成,将运行额外的线程。
请找到我的代码:-
class MyThreadClass inmplements Runnable {
public static void main(String args[]){
threadPoolTaskExecutor.setWaitForTasksToCompleteOnShutdown(true);
for(int i=0;i<10;i++)
threadPoolTaskExecutor.execute(this);
}
public void run(){
while(true){
int checkQueueSize = jmsQueue.getSize();
if(checkQueueSize<=1000){
jmsQueue.pushMessage("Hello Thread");
}
}
}
}
修改:-
- 创建 10 个线程并通过传递 Runnable class 对象将它们分配给 运行 作业。
- 删除不必要的 while 循环作为执行无限迭代的外循环。