- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在从执行程序服务创建固定线程池。但是,如果出现一些运行时异常或错误(OutOfMemory Error),则线程将死亡,线程数量将不断减少,有时线程数量将为零,这称为静默线程终止。
一种方法是捕获 throwable(这不是一个好的做法)以避免线程被杀死。有什么办法可以让我们始终保持固定的线程数量。如果线程终止/死亡,则应自动生成一个新线程,以便我们始终拥有固定数量的线程。
任何建议都是值得赞赏的。
最佳答案
SingleThreadExecutor
的 ApiDocs声明如下:“但是请注意,如果该单个线程由于关闭之前执行期间的失败而终止,则如果需要执行后续任务,一个新线程将取代它。”
这似乎也适用于具有多个线程的线程池(请参见下面的演示程序)。因此,除非程序运行时遇到真正的 OutOfMemoryError(例如,不是分配了太大字节数组的意外错误),否则不会发生静默线程终止。如果程序遇到真正的 OutOfMemoryError ,那么我认为无能为力:必须执行的各种语句(在最终 block 中)可能会由于内存不足而突然无法执行,并且这可能会使程序处于不一致的状态(就像没有线程的线程池)。
下面的演示程序显示了所有任务都已执行,并且 thead-names 显示了线程池创建的新线程:
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
public class SilentKillThread {
public static void main(String[] args) {
try {
new SilentKillThread().runTest();
} catch (Exception e) {
e.printStackTrace();
}
}
static int MAX_TASKS = 3;
static long SLEEP_TIME_MS = 400;
AtomicInteger tasksDoneCount = new AtomicInteger();
public void runTest() throws Exception {
ThreadPoolExecutor tp = new ThreadPoolExecutor(MAX_TASKS, MAX_TASKS,
60L, TimeUnit.SECONDS,
new LinkedBlockingQueue<Runnable>());
for (int i = 0; i < MAX_TASKS; i++) {
tp.execute(new FailingTask());
}
for (int i = 0; i < MAX_TASKS; i++) {
tp.execute(new SleepingTask());
}
tp.shutdown();
if (tp.awaitTermination(SLEEP_TIME_MS * 4, TimeUnit.MILLISECONDS)) {
System.out.println("Finished");
} else {
System.out.println("Finished but threadpool still active.");
}
System.out.println("Tasks done: " + tasksDoneCount.get());
}
class FailingTask implements Runnable {
@Override
public void run() {
String tname = Thread.currentThread().getName();
System.out.println(tname + " Sleeping");
try { Thread.sleep(SLEEP_TIME_MS); } catch (Exception e) { e.printStackTrace();}
int tcount = tasksDoneCount.incrementAndGet();
System.out.println(tname + " Done sleeping " + tcount);
throw new OutOfMemoryError();
}
}
class SleepingTask implements Runnable {
@Override
public void run() {
String tname = Thread.currentThread().getName();
System.out.println(tname + " Sleeping");
try { Thread.sleep(SLEEP_TIME_MS); } catch (Exception e) { e.printStackTrace();}
int tcount = tasksDoneCount.incrementAndGet();
System.out.println(tname + " Done sleeping " + tcount);
}
}
}
关于java - 始终保持固定的线程数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24583064/
我有一个包含一些宏和用户表单的 Excel 文件。 我不希望用户在没有密码的情况下访问文件本身。他们应该只能看到用户表单并通过用户表单输入数据。 这是我目前拥有的代码。 Private Sub Wor
我正在使用 ui 自动完成功能:over here 我需要始终打开自动完成功能,因此当单击正文中的某个位置时它不应该关闭。我已经用谷歌搜索过这个但我找不到任何东西。 最佳答案 抱歉,回复晚了! 我觉得
我有几个使用 Drupal 的站点,我有几个服务器,live,dev1,dev2... Drupal 的代码库存储库很大 (112Mb),所以我很想充分利用 git 的硬链接(hard link)功能
我需要一个始终保存 n 的数据结构迄今为止插入的最大项目(无特定顺序)。 所以,如果 n是 3,我们可以在下面的 session 中插入一些数字并且容器的内容发生变化: [] // now inse
这个问题在这里已经有了答案: Why don't flex items shrink past content size? (5 个答案) 关闭 5 年前。 我在 flexbox 中有 5 列 di
Smartgit 一直 pop 登录表单! 我已经在我的服务器上部署了 git。严格按照 git 设置的说明进行操作。 然后我用puttygen生成开放的SSH私钥,填写密码,把代码放在“public
我在对齐 div 时遇到问题。我在一个容器中有 5 个 div,全部向左浮动,按照下图设置。 每个 div 的宽度为 425px,div 与容器之间的边距始终为 15px,容器的宽度为 1350px。
我正在使用带有集成颠覆控制的 NetBeans。 如果我通过 TortoiseSVN 进行提交、添加等操作,NetBeans 将无法识别这些操作。 显然,如果我通过 NetBeans 进行更改,我的本
我知道有很多这样的问题,但我阅读了所有这些问题,其中没有一个解决了我的问题。下面我将展示我的 View 和 Controller 中的代码,以便您了解我的代码。 View :
我有一个 100% 高度的左浮动和 100% 的右浮动。一切正常,直到我用文本填充一侧,另一侧才会停止。 我该如何解决这个问题? 最佳答案 在为两列插入父 div 后,您可以使用 css 表。例如:
我使用此 JavaScript 代码是为了在验证失败后突出显示文本框和其他控件(在其上指定了 ASP.NET 验证器)。 $(document).ready(function() {
我是一名优秀的程序员,十分优秀!