- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
从互联网上的多篇文章中建议不要吞下InterruptedException
.当我要重用同一个线程时,使用线程池执行程序来做这样的事情更有意义。
public static void main(String[] args) throws InterruptedException {
ExecutorService executor = Executors.newSingleThreadExecutor();
Future<?> future = executor.submit(() -> {
printNumbers(); // first call
printNumbers(); // second call
});
Thread.sleep(3_000);
executor.shutdownNow(); // will interrupt the task
executor.awaitTermination(3, TimeUnit.SECONDS);
}
private static void printNumbers() {
for (int i = 0; i < 10; i++) {
System.out.print(i);
try {
Thread.sleep(1_000);
} catch (InterruptedException e) {
Thread.currentThread().interrupt(); // preserve interruption status
break;
}
}
}
Object LOCK = new Object();
public void doSomeJob() {
myThread = new Thread(new Runnable() {
public void run() {
try {
synchronized(LOCK) {
System.out.println("Inside run");
LOCK.wait();
}
} catch(InterruptedException ignored){}
}
}
}
Thread.currentThread().interrupt();
吗? ?这有什么意义吗?
最佳答案
我将根据 部分给出答案7.1.2 好书Concurrency in Practice通过布赖恩·戈茨。
在您的第一个示例中,您使用 ExecutorService
. ExecutorService
管理它自己的线程。您不是这些线程的所有者,因此您不知道中断对它们意味着什么(例如 ThreadPool 可能会选择杀死被中断的线程并创建新线程)。这就是为什么在向此池提交可取消任务时应保留中断状态的原因。此引文适用于这种情况:
Tasks do not execute in threads they own.They borrow threads owned by a service such as a thread pool. Code that doesn't own the thread (for a thread pool, any code outside of the thread pool implementation) should be careful to preserve the interrupted status so that the owning code can eventually act on it, even if the "guest" code acts on the interruption as well. (If you are housesitting for someone, you don't throw out the mail that comes while they're away - you save it and let them deal with it when they get back, even if you do read their magazines.)
What you should not do is swallow the
InterruptedException
by catching it and doing nothing in the catch block, unless your code is actually implementing the interruption policy for a thread
ThreadPool
可能会杀死被中断的线程并创建一个新线程)。它由线程的所有者定义。 InterruptedException
的方法,这很容易实现。 .或者你可以通过调用Thread::isInterrupted
来查看线程的中断标志。 (例如在循环中)。任务的实现者选择如何处理这个问题。 Thread
的所有者)。这就是为什么要保留中断状态或重新抛出
InterruptedException
被认为是一种很好的做法。
关于java - 什么时候调用 Thread.currentThread().interrupt() 什么时候不调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57575457/
我见过许多具有如下所示的线程过程的示例。 private void ThreadProc() { while (serviceStarted) {
当前Thad.sleep的实现是:。currentThread是native方法。在多核系统中,我们可以同时运行多个线程。。那么当前的主题是如何决定的呢?
当前Thad.sleep的实现是:。CurrentThread是本机方法。在多核系统中,我们可以同时运行多个线程。。那么当前的主题是如何决定的呢?
我有一个面向全局市场的应用程序,需要本地化。在开发过程中,我遇到了一些问题,即使我更改了语言环境,我的附属程序集似乎也从未被选中。经过一些研究,我现在明白了为什么会这样,并且能够通过在代码中设置 Cu
我试图通过为它们分配名称来识别一些线程(属性:System.Threading.Thread.CurrentThread.Name),但后来我意识到我可以使用 System.Threading。线程.
我认为Thread对象就像是带有名称和静态Thread.CurrentThread()的抽象对象,就像访问Thread对象的方式一样。显然,这是错误的假设。。是这样的吗?
我认为Thread对象就像是带有名称和静态Thread.CurrentThread()的抽象对象,就像访问Thread对象的方式一样。显然,这是错误的假设。。是这样的吗?
我有一个 Runnable 队列,它在指定线程中一个一个地调用。 val queue = LinkedBlockingQueue Unit>() val queueThread = thread {
我想从方法currentThread()中的doc开始: Returns a reference to the currently executing thread object. @return t
有一个名为Data的类,它被称为我的其他类。 Data 类被许多线程访问,我想在每个线程上存储一些信息。具体来说,Data 有一个名为 name(String) 的实例,我想将此 name 存储到创建
在我的调试器上花费了太多时间之后,我偶然发现了一些我还不清楚的有趣的东西。我希望有更多 Java 经验的人来解释和确认这一点: 我没有每次都使用Thread.currentThread().isInt
我可以做 ConcurrentHashMap存储线程的数据并使用 Thread.currentThread()取回它?我检查了Java源码,发现currentThread()是本地的并且 equals
在下面的代码中: ThreadStart ts = new ThreadStart((MethodInvoker)delegate { executingThr
我有一个错误报告,其中 double.Parse(input) 在输入 "0.69803923368454" 时抛出以下异常: FormatException: Unknown char: . Sys
在 .NET BCL 中,有一个 CurrentThread 和一个 ProcessThread 对象。这些有什么区别? 谢谢 最佳答案 这是设计 .NET 2.0 时 SQL Server 项目的后
谁能解释一下[NSThread currentThread]返回值的含义? NS日志 NSLog(@"%@", [NSThread currentThread]); 结果 {name = (null)
你能告诉我 Thread.currentThread().getContextClassLoader() 和 TestServlet.class.getClassLoader() 之间的区别是什么,不
Thread.currentThread() 是一个static 方法,它提供对当前正在执行的 Thread 的引用(基本上是对“this”线程的引用)。 在静态方法中访问非静态成员(尤其是 this
在较旧的 asp.net 项目中,我们通常在 Application_BeginRequest - 处理程序 (Global.asax) 中设置语言,如下所示: System.Threading.Th
我可以制作 Dictionary存储线程的数据并使用 Thread.CurrentThread 检索它? 最佳答案 可以,但您还需要同步(因为 Dictionary 不是线程安全的)。 备选方案: T
我是一名优秀的程序员,十分优秀!