这是中提到的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) 我是新手ScheduledThreadPoolExecutor(因为我通常使用简单的Timer,但人们一直在建议反对它),我不太明白传递给ScheduledThreadPoolExecutor(int)构造函数的适当整数值是什么.
有人能解释一下吗?
谢谢
在Java中拥有多个线程池有什么优缺点?我见过代码,其中有多个线程池用于不同的"类型"任务,我不确定它是更好的设计还是只是开发人员是懒惰的.一个示例是使用ScheduledThreadPoolExecutor来定期执行或超时的任务,并使用另一个ThreadPoolExecutor来完成其他任务.
java multithreading scheduled-tasks java.util.concurrent threadpoolexecutor
我正在开发应用程序(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
我在里面有很多任务TheadPoolExecutor.我的界面上有一个停止按钮,可以ThreadPoolExecutor立即终止所有线程.我正在寻找一种方法来做到这一点.(没有shutDown()或shutDownNow()).
谢谢
我的问题与此问题密切相关.正如在那里发布的那样,我希望主线程等到工作队列为空并且所有任务都已完成.然而,在我的情况下,问题是每个任务可以递归地导致提交新任务以进行处理.这使收集所有这些任务的未来变得有点尴尬.
我们当前的解决方案使用忙等待循环来等待终止:
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是一个在创建每个新任务时增加的值.这有效但我认为由于忙碌的等待而不是很好.我想知道是否有一种好方法可以使主线程同步等待,直到被明确唤醒.
在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
我在我的多线程应用程序中使用了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
在我的Android应用程序中,我使用THREAD_POOL_EXECUTOR使用多个AsyncTask,这使得任务并行运行.有时应用程序挂起.以下是我使用的代码.
如何找到应用程序挂起的点?
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)这对我来说是最令人困惑的话题之一。所以我的问题是,完成后传达后台线程结果的正确方法是什么?.
想象一下,我想TextView用我刚刚下载的一些信息更新一些信息。当我需要执行后台任务时,我使用了 3 样东西:
非常容易使用,这个onPostExecute()方法有将结果直接返回给 UiThread的方法,这样我就可以使用回调接口或做任何我想做的事情。我喜欢这门课,但它已被弃用。
这就是我在需要执行后台任务时实际使用的方法,而我的问题就出现在我必须将结果提供给 UiThread 的那一刻。我自己了解Looper和Handler类以及有关mainLooper。
所以,当我需要返回一些结果时,我使用的方法runOnUiThread(),正如我所读到的,只是获取LooperUi 线程的 并将我Runnable的发布到队列中。
嗯,这是有效的,我可以与主线程通信,但是,我发现它真的很难看,而且我确信有一种比填充我所有的“ runOnUiThread()”方法代码更优雅的方法。此外,如果后台任务需要太多时间,也许用户已经更改Activity或Fragment当内部代码runOnUiThread()运行时会导致什么Exceptions(我知道使用LiveData和MVVM模式可以解决最后一个问题,但我在一个遗留项目中工作,我不能重构所有代码,以便我使用经典的 Activity mvc 模式)
那么,还有另一种方法吗?你能举个例子吗?我真的搜索了很多,但没有找到任何东西......
我实际上在一个遗留项目中工作,我必须使用 Java,所以不能使用 Kotlin coroutines,但我发现它们易于使用且功能强大。
任何帮助,将不胜感激!
java multithreading android android-asynctask threadpoolexecutor