标签: threadpoolexecutor

Spring ThreadPoolTask​​Scheduler vs ThreadPoolTask​​Executor

这是中提到的Spring文档是:

ThreadPoolTaskScheduler实际上也实现了Spring的TaskExecutor接口,因此单个实​​例可以尽快用于异步执行,也可以用于计划和可能重复执行.

那么我们想要在ThreadPoolTaskExecutor实例上使用实例的场景是哪些ThreadPoolTaskScheduler

我目前正在使用Spring XML.我正在创建ThreadPoolTaskScheduler如下bean :

<task:scheduler id="myScheduler" pool-size="1"/>
Run Code Online (Sandbox Code Playgroud)

ThreadPoolTaskExecutor实例的bean 可以创建为

<task:executor id="executor" pool-size="10"/>
Run Code Online (Sandbox Code Playgroud)

spring scheduled-tasks task executor threadpoolexecutor

14
推荐指数
1
解决办法
6821
查看次数

ScheduledThreadPoolExecutor的构造函数中"核心池大小"的含义

我是新手ScheduledThreadPoolExecutor(因为我通常使用简单的Timer,但人们一直在建议反对它),我不太明白传递给ScheduledThreadPoolExecutor(int)构造函数的适当整数值是什么.

有人能解释一下吗?

谢谢

java threadpool threadpoolexecutor

13
推荐指数
2
解决办法
6480
查看次数

拥有单个线程池比多个线程池更好的设计

在Java中拥有多个线程池有什么优缺点?我见过代码,其中有多个线程池用于不同的"类型"任务,我不确定它是更好的设计还是只是开发人员是懒惰的.一个示例是使用ScheduledThreadPoolExecutor来定期执行或超时的任务,并使用另一个ThreadPoolExecutor来完成其他任务.

java multithreading scheduled-tasks java.util.concurrent threadpoolexecutor

13
推荐指数
2
解决办法
3914
查看次数

Java(Android)多线程进程

我正在开发应用程序(Matt的traceroute windows版本http://winmtr.net/),它创建多个线程,每个线程都有自己的进程(执行ping命令).ThreadPoolExecutor一段时间后关闭所有线程(例如10秒)

ThreadPoolExecutor 使用阻塞队列(在执行之前保存任务)

int NUMBER_OF_CORES = Runtime.getRuntime().availableProcessors();
ThreadPoolExecutor poolExecutor = new ThreadPoolExecutor(
    NUMBER_OF_CORES * 2, NUMBER_OF_CORES * 2 + 2, 10L, TimeUnit.SECONDS, 
    new LinkedBlockingQueue<Runnable>()
);
Run Code Online (Sandbox Code Playgroud)

PingThread.java

private class PingThread extends Thread {

    @Override
    public void run() {
        long pingStartedAt = System.currentTimeMillis();
        // PingRequest is custom object
        PingRequest request = buildPingRequest(params);

        if (!isCancelled() && !Thread.currentThread().isInterrupted()) {

            // PingResponse is custom object

            // Note:
            // executePingRequest uses PingRequest to create a command 
            // which than create …
Run Code Online (Sandbox Code Playgroud)

java multithreading android blockingqueue threadpoolexecutor

13
推荐指数
2
解决办法
1699
查看次数

如何强制立即终止ThreadPoolExecutor中的所有worker

我在里面有很多任务TheadPoolExecutor.我的界面上有一个停止按钮,可以ThreadPoolExecutor立即终止所有线程.我正在寻找一种方法来做到这一点.(没有shutDown()shutDownNow()).

谢谢

java multithreading threadpool threadpoolexecutor

12
推荐指数
3
解决办法
2万
查看次数

执行程序:如果递归创建任务,如何同步等待所有任务完成?

我的问题与问题密切相关.正如在那里发布的那样,我希望主线程等到工作队列为空并且所有任务都已完成.然而,在我的情况下,问题是每个任务可以递归地导致提交新任务以进行处理.这使收集所有这些任务的未来变得有点尴尬.

我们当前的解决方案使用忙等待循环来等待终止:

        do { //Wait until we are done the processing
      try {
        Thread.sleep(200);
      } catch (InterruptedException e) {
        throw new RuntimeException(e);
      }
    } while (!executor.getQueue().isEmpty()
             || numTasks.longValue() > executor.getCompletedTaskCount());
Run Code Online (Sandbox Code Playgroud)

numTasks是一个在创建每个新任务时增加的值.这有效但我认为由于忙碌的等待而不是很好.我想知道是否有一种好方法可以使主线程同步等待,直到被明确唤醒.

java concurrency threadpoolexecutor

12
推荐指数
2
解决办法
1万
查看次数

当app使用列表时,在Android 4.4中避免RejectedExecutionException

在Android 4.4中,似乎代码中的更改导致使用AsyncTasks加载列表图标.结果是Android 4.4上的许多用户都获得RejectedExecutionException了超过队列大小限制.

Code Google的一位聪明的用户发现了这一点,并以这种方式解释了它:

ResolverActivity将在Android 4.4上抛出RejectedExecutionException.

我查看了最新ResolverActivity的代码,并注意到在ResolveListAdapter.bindView方法中它使用了新的LoadIconTask().execute(info),这应该是根本原因.LoadIconTask是AsyncTask的子类,同时运行的AsyncTask太多会导致RejectedExecutionException.

可以在Android GitHub仓库中找到ResolverActivity更改.

我的应用程序目前有82个堆栈跟踪RejectedExecutionException,所有这些都是针对Android 4.4的.堆栈示例开始:

java.util.concurrent.RejectedExecutionException: Task android.os.AsyncTask$3@41d44580 rejected from java.util.concurrent.ThreadPoolExecutor@41a575c0[Running, pool size = 5, active threads = 5, queued tasks = 128, completed tasks = 140]
 at java.util.concurrent.ThreadPoolExecutor$AbortPolicy.rejectedExecution(ThreadPoolExecutor.java:2011)
 at java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:793)
 at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1339)
 at android.os.AsyncTask.executeOnExecutor(AsyncTask.java:590)
 at android.os.AsyncTask.execute(AsyncTask.java:535)
 at com.android.internal.app.ResolverActivity$ResolveListAdapter.bindView(ResolverActivity.java:716)
 at com.android.internal.app.ResolverActivity$ResolveListAdapter.getView(ResolverActivity.java:702)
 at android.widget.AbsListView.obtainView(AbsListView.java:2255)
...
Run Code Online (Sandbox Code Playgroud)

有没有办法回避或处理这种变化?

android android-asynctask threadpoolexecutor android-4.4-kitkat

12
推荐指数
1
解决办法
6927
查看次数

如何正确使用Java Executor?

我在我的多线程应用程序中使用了Java Executors,但我似乎无法弄清楚何时最好使用以下各种方法:

1.

ExecutorService executor=Executors.newFixedThreadPool(50);
executor.execute(new A_Runner(... some parameter ...));
executor.shutdown();
while (!executor.isTerminated()) { Thread.sleep(100); }
Run Code Online (Sandbox Code Playgroud)

2.

int Page_Count=200;
ExecutorService executor=Executors.newFixedThreadPool(50);
doneSignal=new CountDownLatch(Page_Count);
for (int i=0;i<Page_Count;i++) executor.execute(new A_Runner(doneSignal, ... some parameter ...));
doneSignal.await();
executor.shutdown();
while (!executor.isTerminated()) { Thread.sleep(100); }
Run Code Online (Sandbox Code Playgroud)

3.

int Executor_Count=30;
ThreadPoolExecutor executor=new ThreadPoolExecutor(Executor_Count,Executor_Count*2,1,TimeUnit.SECONDS,new LinkedBlockingQueue());
List<Future<String>> futures=new ArrayList<>(3330);

for (int i=0;i<50;i++) futures.add(executor.submit(new A_Runner(... some parameter ...));
executor.shutdown();
while (!executor.isTerminated()) { executor.awaitTermination(1,TimeUnit.SECONDS); }
for (Future<String> future : futures)
{
    String f=future.get();
    // ...
}
Run Code Online (Sandbox Code Playgroud)

具体来说,在[2]中,如果我跳过doneSignal,那么它就像[1],那么doneSignal的用途是什么?

另外,在[3]中,如果我添加一个doneSignal怎么办?或者有可能吗?

我想知道的是:这些方法是否可以互换,或者是否存在我应该使用上述特定类型的某种情况?

java multithreading executorservice java.util.concurrent threadpoolexecutor

11
推荐指数
1
解决办法
3272
查看次数

悬挂应用程序的多个异步任务

在我的Android应用程序中,我使用THREAD_POOL_EXECUTOR使用多个AsyncTask,这使得任务并行运行.有时应用程序挂起.以下是我使用的代码.

  1. 你能告诉我如何微调以避免任何悬挂问题吗?
  2. 如何找到应用程序挂起的点?

    new fetchInitialCoinsParallel().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, url);
    
    prefCoinList = getPrefCoin();
    if(prefCoinList.size()>0){
        for(int i=0;i<prefCoinList.size();i++){
            new fetchAltCoinsParallel().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, url);
        }
    }
    
    public class fetchAltCoinsParallel extends AsyncTask<String, String, String> {
    @Override
    protected void onPreExecute() {
    }
    
    protected String doInBackground(String... params) {
        try {
            InputStream is = getDataFromURL(params[0]);
            if(is!=null){
                BufferedReader br = new BufferedReader(new InputStreamReader(is));
                synchronized(this){
                    brList.add(br);
                }
    
            }else{
                prefCoinNotLoadedTimeOutCount=prefCoinNotLoadedTimeOutCount+1;
            }
    
    
            if(brList.size()==prefCoinList.size()-prefCoinNotLoadedTimeOutCount){
                try {
                    loadAltCoins(getAltCoinDataParallel());
                } catch (IOException e) {
                    e.printStackTrace();
                }
    
                maingame.dataReady=true;
            }
    
        } catch (IOException e) {
            e.printStackTrace();
        } 
        return null;
    }
    
    protected void …
    Run Code Online (Sandbox Code Playgroud)

android android-asynctask threadpoolexecutor

11
推荐指数
1
解决办法
616
查看次数

将后台线程的结果传达给 Android 中的 Ui 线程的正确方法

这对我来说是最令人困惑的话题之一。所以我的问题是,完成后传达后台线程结果的正确方法是什么?.

想象一下,我想TextView用我刚刚下载的一些信息更新一些信息。当我需要执行后台任务时,我使用了 3 样东西:

异步任务

非常容易使用,这个onPostExecute()方法有将结果直接返回给 UiThread的方法,这样我就可以使用回调接口或做任何我想做的事情。我喜欢这门课,但它已被弃用。

线程池执行器

这就是我在需要执行后台任务时实际使用的方法,而我的问题就出现在我必须将结果提供给 UiThread 的那一刻。我自己了解LooperHandler类以及有关mainLooper

所以,当我需要返回一些结果时,我使用的方法runOnUiThread(),正如我所读到的,只是获取LooperUi 线程的 并将我Runnable的发布到队列中。

嗯,这是有效的,我可以与主线程通信,但是,我发现它真的很难看,而且我确信有一种比填充我所有的“ runOnUiThread()”方法代码更优雅的方法。此外,如果后台任务需要太多时间,也许用户已经更改ActivityFragment当内部代码runOnUiThread()运行时会导致什么Exceptions(我知道使用LiveDataMVVM模式可以解决最后一个问题,但我在一个遗留项目中工作,我不能重构所有代码,以便我使用经典的 Activity mvc 模式)

那么,还有另一种方法吗?你能举个例子吗?我真的搜索了很多,但没有找到任何东西......

协程

我实际上在一个遗留项目中工作,我必须使用 Java,所以不能使用 Kotlin coroutines,但我发现它们易于使用且功能强大。

任何帮助,将不胜感激!

java multithreading android android-asynctask threadpoolexecutor

11
推荐指数
3
解决办法
3752
查看次数