我在java中对future.get()有一个奇怪的问题.它总是以中断的返回,但是奇怪的是,例外的原因是无效的,所以我不能告诉谁打断了我. 情况变得更糟,因为我在致电get get()之前检查一下,并且未来的工作已经完成. 这是负责下面输出的代码. f是未来的,而可可的回报是代理并不相关的标签.抱歉,如果打印线太多,我只是想尽我所能提供糊状信息.现在,来自Callable的呼叫方法是一个简单的System.out.println("Hola soy agente"),正如您将看到的,被打印出来,这意味着可呼叫并没有导致异常 这是代码: try { System.out.println(f.isDone()); //true System.out.println(f.isCancelled()); //false System.out.println(f.toString()); /
以下是关于 interrupted-exception 的编程技术问答
可能的重复: 如何终止插座上的线程块立即? 我的client在线程中运行,想从Java的插座读取.但是在阅读时,也许我想杀死线程.所以我interrupt,但是Socket的阅读方法会抛出InterruptedException吗?我没有找到. 那么,我如何在读取插座上阻塞时,我该如何很好地要求线程死亡? 谢谢 解决方案 它已经回答了>如何立即终止插座io操作上的螺纹阻塞? 基本上,当您close()套接字时,所有关联的流将关闭,从而导致所有阻止的操作被封锁. 或者您可以致电Thread.interrupt(),它将中断阻止操作,从而使其投掷InterruptedException. 其他解决方案 Nio Channels具有
如果我创建自己的线程(即不是线程池),而我呼叫sleep或任何其他可中断的方法的某个地方,可以忽略InterruptedException 如果我知道代码中的其他人都在做一个中断在线程上. 换句话说,如果该线程应该在JVM时长,这意味着线程不容易中断,是否可以安全地假设InterruptedException将被调用永远不会被称为被吞下? 解决方案 忽略检查的例外永远不会安全. 目前,它可能对您来说是可以的,但是如果其他任何程序员使用您的代码/API,则它们应该期望标准行为: 这是,线程对中断呼叫的"反应",,但用"反应"来描述任何"反应". 我的意思是,这取决于线程的开发人员可以确定线程如何处理中断,而Java具有不是 任何预定的规则,但是您应该记录线程的"反应"(带有文档注释). 例如,InterruptedException仅是从阻止方法(例如Thread.sleep(...))中抛出的,但是从正常行的行为中 (这意味着默认情况下只忽略了中断) ,
我只是想知道它们之间的基本区别. 我在某些地方发现陷阱本质上也被称为软件中断,或者类似于例外. 另外,软件中断和异常之间的基本区别是什么? 软件中断可以通过int指令生成,但是陷阱只能由某些场景(例如Divide ot divide)生成?是的吗? 请为此查询提供合适的答案,该查询涵盖,S/W中断陷阱和异常. 解决方案 术语确实有点模糊,可能取决于CPU供应商. 很明显,硬件中断是由硬件信号触发的,并使CPU输入预定义的ISR.这些是(通常是外部)硬件触发的例外. 陷阱的符号在CPU供应商之间有所不同.非智能CPU can (例如,在68000或PowerPC CPU上)的陷阱是软件中断.这些CPU具有陷阱指令.在x86上,该指令将是iNT xxx,在ARM CPU SWI/SVC上,在PowerPC陷阱#XX上.这将是用户程序故意触发的例外(通常用于输入操作系统) Intel World中的陷阱是特殊条件,例如按零分割或其他错误(例如无
当中断CPU时,如果确认该问题,则通过保存当前地址位置来处理它.否则将被忽略. 我想知道是否打断了汇编指令呼叫. 例如, mvi a, 03h ; put 3 value into acc. in 8080 assembly 可以中断一行指令吗?或者,它是原子? 始终保证"一行组装指令"总是原子? 如果没有"锁定"关键字,即8080组件中,如何提供原子性? 例如,如果要操作64位总和,但是没有办法使用"一行指令"来完成操作,并且在按和运行时会中断.如何在组装级别预防? 这个概念开始为我沸腾. 解决方案 是的,所有"正常" ISA(包括8080和x86)保证指示在同一核心上的中断是原子的.指令已经完全执行,并且其所有架构效应都是可见的(在中断处理程序中),或者没有一个.通常仔细记录与此规则的任何偏差. 例如,英特尔的X86手册vol.3(〜1000页PDF)确实提出了这一点的意义: 6.6程序或任务重新启动 为了在处理异常
给出了一个线程,该线程未被阻止时被中断(即没有抛出中断的exception),该线程后来尝试睡觉时会抛出一个中断的exception吗? InterruptedException-如果任何线程中断了当前线程.当抛出此例外时,清除当前线程的中断状态. 解决方案 是的,它确实如此. 文档在这一点上可能并不清楚,但这很容易测试(例如,请参见下面的答案),并查看规范(热点)实现. thread.sleep shells out to os:sleep,它在凝视睡眠过程之前先检查中断,因为您可以看到在这里(寻找os:sleep). 如果不是这种情况,则中断或多或少是不可能使用的.如果他们碰巧到达任何sleep()电话外,它们将会丢失,因为随后的sleep()呼叫会忽略它们.您甚至都无法重新拦截线程,因为它已经被中断. 其他解决方案 我发现没有说明这是强制性的文件,但我发现在我的系统(32位客户端VM 1.7)上,试图在设置中断的平面设置时试图睡觉 do 投掷.测试
我遇到了下面的代码,我想知道它是否确实做了我认为确实如此: synchronized(sObject) { mShouldExit = true; sObject.notifyAll() while (!mExited) { try { sObject.wait(); } catch (InterruptedException ex) { Thread.currentThread().interrupt(); } } } 关于上下文:还有另一个线程检查mShouldExit(sObject监视器内部),并将在这种情况下退出. 对我来说,这似乎不是正确的模式.如果发生中断,它将再次设置中断状态,因此当它返回sObject.wait()时,另一个InterruptedException会出现等等.切勿发布sObject监视器.这可能会导致无限
以下程序演示了问题(最新的JVM和Whatnot): public static void main(String[] args) throws InterruptedException { // if this is true, both interrupted and isInterrupted work final boolean withPrint = false; // decide whether to use isInterrupted or interrupted. // if this is true, the program never terminates. final boolean useIsInterrupted = true; ExecutorService executor = Executors.newSingleThreadExecutor(); final CountDownLatch
i在第42行和43行中有一个错误:Thread t1=new Thread(()->prod.test());,Thread t2=new Thread(()->cons.test()); 未手动异常类型InterruptedException .如果我尝试QuickFix,它将使用Catch exception 创建尝试捕获,它将具有相同的错误,并将尝试以相同的方式将其修复,以继续使用尝试捕获. import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; interface Predicate { public void test() throws InterruptedException; } class MyClass { int num = 0; Lock lock = new ReentrantLock(); publ
我了解中断的exception的作用以及为什么要投掷.但是,在我的应用程序中,我在仅在我的应用程序中知道的线程上等待SwingUtilities.invokeAndWait()时会得到它,并且我的应用程序在任何线程上都从未调用Thread.interrupt(),也永远不会将线程的引用传递给任何人. 所以我的问题是:谁打断了我的线程? 有什么办法告诉吗?有原因为什么InterruptedException不包含请求中断的线程的名称? 我读到它可能是这样做的框架或库,我们使用以下内容,但是我想不出它们中断我的线程的原因: Hibernate 春天 log4j mySQL连接器 解决方案 如果可能的话,您可以扩展Thread并覆盖此线程打印stacktrace或抛出不支持的操作例外的方法. 您还可以使用扩展Thread类存储对中断线程的引用,并在捕获中断的异常后阅读它. 其他解决方案 通常,如果您想知道谁在做某事,请附上调试器,放断点,然后
基本上,问题标题怎么说. Thread t = new Thread(someRunnable); t.start(); t.interrupt(); t.join(); //does an InterruptedException get thrown immediately here? 从我自己的测试中看来,但只是想确定.我猜Thread.join()在执行"等待"例程之前,请检查线程的interrupted状态吗? 解决方案 interrupt()中断您中断的线程,而不是进行中断的线程. c.f. Thread.currentThread().interrupt(); t.join(); // will throw InterruptedException 其他解决方案 在thread.join()之前调用thread.interrupt()会导致join()立即扔一个InterruptedException? 不,它不会投掷.只有当
我需要制作一个我的同步和异步功能的库. executeSynchronous() - 等到我得到结果,返回结果. executeAsynchronous() - 如果需要,可以立即返回未来,可以在其他事情完成后处理. 我的库的核心逻辑 客户将使用我们的库,他们将通过通过DataKey构建器对象来称呼它.然后,我们将通过使用该DataKey对象构造URL,并通过执行http client call call to nut urol,然后在将响应恢复为JSON字符串之后,我们将将该JSON字符串发送给我们的客户,因为它是通过创建DataResponse对象.有些客户会致电executeSynchronous(),有些客户可能会拨打executeAsynchronous(),所以这就是为什么我需要在库中分别提供两种方法. 接口: public interface Client { // for synchronous public DataRe
我最近将我的计算机更新为更强大的计算机,并带有四核高线处理器(i7),因此可用.现在,我有时退出时会出现以下错误(System.exit(0))我正在开发的应用程序(带有摇摆的GUI): Exception while removing reference: java.lang.InterruptedException java.lang.InterruptedException at java.lang.Object.wait(Native Method) at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:118) at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:134) at sun.java2d.Disposer.run(Disposer.java:125) a
java的螺纹何时会抛出interruptedException?忽略它安全吗?我没有做任何多线程.我只想等待几秒钟,然后重试操作. 解决方案 您通常不应该忽略异常.查看以下论文: 不要吞咽中断 有时投掷中断的exception是 不是一个选项,例如当可运行呼叫定义的任务时 可中断的方法.在这种情况下,您不能重新恢复 IntruptedException,但您也不想做任何事情.当一个 阻止方法检测中断并抛出中断exception, 它清除了中断的状态.如果您抓住了InterruptedException 但是不能重新责备它,您应该保留证据表明 中断发生,以使呼叫堆栈上的代码更高 了解中断并在此愿意的情况下做出回应.这个任务 通过将Interrupt()调用"重新中断"当前 线程,如列表3所示,至少每当您捕获时 IntruptedException,不要重新启动,重新中断电流 返回之前的线程. public class TaskRunner implements
处理以下方式InterruptedException有什么区别?什么是最好的方法? try{ //... } catch(InterruptedException e) { Thread.currentThread().interrupt(); } 或 try{ //... } catch(InterruptedException e) { throw new RuntimeException(e); } 编辑:我也想知道在哪种情况下使用这两个方案. 解决方案 处理InterruptException的以下方式有什么区别?什么是最好的方法? 您可能会问这个问题,因为您已经称呼抛出InterruptedException的方法. 首先,您应该看到throws InterruptedException的含义:方法签名的一部分以及调用您调用的方法的可能结果.因此,首先要接受一个事实,即InterruptedException是方法
在由ExecutorService管理的任务内捕获InterruptedException时,我们应该设置中断的标志吗?还是我们应该吞下InterruptedException? 示例: final ExecutorService service = ...; final Object object = ...; service.submit(() -> { try { while (!condition) { object.wait(); } } catch (final InterruptedException exception) { Thread.currentThread().interrupt(); // yes or no? } }); 解决方案 在提交给ExecutorService的任务中,接收中断是取消执行任务的信号.因此,在您的代码
假设我有以下代码: while(!Thread.currentThread().isInterrupted()){ //do something Thread.sleep(5000); } 现在Thread.sleep抛出`interruptedException,所以应该像这样: while(!Thread.currentThread().isInterrupted()){ //do something try{ Thread.sleep(5000); } catch(InterruptedException e){ } } 如果我击中catch while循环会继续还是需要做Thread.currentThread().interrupt()?如果我确实称这种方法,那也不会导致InterruptedException吗?否则我首先如何获得例外? 也有: whil
我有这个代码.如果在等待添加到队列时中断,则只能抛出Exception.但是该队列是无限的,因此应该尽快增加.为什么我的关闭methode投掷InterruptedException? private final LinkedBlockingQueue messages= new LinkedBlockingQueue(); public void run(){ LinkedList messages = new LinkedList(); while (true){ try{ messages.clear(); messages.add(this.messages.take()); this.messages.drainTo(messages);