如果我创建自己的线程(即不是线程池)并在某处调用 sleep 或任何其他可中断方法,如果我不认识其他人,是否可以忽略 InterruptedException 代码正在线程上进行中断。
换句话说,如果线程应该与 JVM 一样长,这意味着线程不可中断,那么假设 InterruptedException 永远不会被调用是否安全,因此异常可以被吞了吗?
最佳答案
从不认为忽略已检查的异常是安全的。
目前可能看起来对你来说没问题,但如果任何其他程序员使用你的代码/API,他们应该期待标准行为:
即线程对中断调用“使用react”,但使用线程文档描述的任何“ react ”。
我的意思是由线程的开发人员来决定和记录线程如何处理中断,Java 没有任何预定义的规则,但您应该 记录您的线程的“ react ”(带有文档注释)。
例如,InterruptedException仅从阻塞方法(如 Thread.sleep(...) )中抛出,但 从不 从正常代码行中抛出(意味着默认情况下简单地忽略中断),这允许开发人员选择(并记录)线程的 react ,喜欢:
Which takes time for development, if not already supported.
Thread.currentThread().interrupt()在捕获 block 中。Which simulates interrupt happening while normal code was running.
java.lang.Error (或子类),并通过 InterruptedException -实例为cause .Which unless documented, is least desired or expected.
解释推迟; InterruptedException 空的 catch block 很危险,因为JVM去掉了interrupted标志,所以肯定应该在catch block 中重新设置,比如:
try {
Thread.sleep(1000);
} catch (InterruptedException ignored) {
Thread.currentThread().interrupt();
}
在我看来,这是 InterruptedException 的最小捕获实现。 s。检查 isInterrupted循环中的标志也没有太大的伤害。
与您 future 的程序员自己花一两天时间寻找意外线程行为的麻烦相比,这只是一点点开销,因为您的项目可能已经增长了一点。
如果您觉得您的代码的可读性受到这些 catch 实现的影响,您可以实现自己的 safeSleep实用方法,负责处理 Exception s 并正确设置标志。
另一方面,InterruptedException在硬件故障的情况下不会由 JVM 本身抛出,它是用户指示的 Exception只有。 所以,如果你不传播你的 技术上就是这样。 但您不应低估人为因素和程序的演变。Thread s引用,不会有其他的Thread可以调用 Thread.interrupt() 的
编辑:正如 ruakh 所指出的,实际上有一种方法可以获得 Thread s 引用,从而安排 Thread.interrupt()称呼。这样一来,热火朝天的开发人员甚至可能不必查看实现不间断 Thread 的类(class)。 .在我看来,这甚至是实现正确异常处理的另一个原因。
另一件事:如果你没有抛出 Exception , 在 INFO 之外的级别记录此类事件可能是个不错的选择。
关于java - 如果没有人调用interrupt(),是否可以忽略InterruptedException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28544867/
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru
我好像记得Lua有类似Ruby的method_missing的东西。还是我记错了? 最佳答案 表的metatable的__index和__newindex可以用于与Ruby的method_missing相同的效果。 关于ruby-难道Lua没有和Ruby的method_missing相媲美的东西吗?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/7732154/
使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta
我希望我的UserPrice模型的属性在它们为空或不验证数值时默认为0。这些属性是tax_rate、shipping_cost和price。classCreateUserPrices8,:scale=>2t.decimal:tax_rate,:precision=>8,:scale=>2t.decimal:shipping_cost,:precision=>8,:scale=>2endendend起初,我将所有3列的:default=>0放在表格中,但我不想要这样,因为它已经填充了字段,我想使用占位符。这是我的UserPrice模型:classUserPrice回答before_val
查看Ruby的CSV库的文档,我非常确定这是可能且简单的。我只需要使用Ruby删除CSV文件的前三列,但我没有成功运行它。 最佳答案 csv_table=CSV.read(file_path_in,:headers=>true)csv_table.delete("header_name")csv_table.to_csv#=>ThenewCSVinstringformat检查CSV::Table文档:http://ruby-doc.org/stdlib-1.9.2/libdoc/csv/rdoc/CSV/Table.html
我有一个奇怪的问题:我在rvm上安装了rubyonrails。一切正常,我可以创建项目。但是在我输入“railsnew”时重新启动后,我有“程序'rails'当前未安装。”。SystemUbuntu12.04ruby-v"1.9.3p194"gemlistactionmailer(3.2.5)actionpack(3.2.5)activemodel(3.2.5)activerecord(3.2.5)activeresource(3.2.5)activesupport(3.2.5)arel(3.0.2)builder(3.0.0)bundler(1.1.4)coffee-rails(
这个问题在这里已经有了答案:Checktoseeifanarrayisalreadysorted?(8个答案)关闭9年前。我只是想知道是否有办法检查数组是否在增加?这是我的解决方案,但我正在寻找更漂亮的方法:n=-1@arr.flatten.each{|e|returnfalseife
我想在一个没有Sass引擎的类中使用Sass颜色函数。我已经在项目中使用了sassgem,所以我认为搭载会像以下一样简单:classRectangleincludeSass::Script::FunctionsdefcolorSass::Script::Color.new([0x82,0x39,0x06])enddefrender#hamlengineexecutedwithcontextofself#sothatwithintemlateicouldcall#%stop{offset:'0%',stop:{color:lighten(color)}}endend更新:参见上面的#re
我发现ActiveRecord::Base.transaction在复杂方法中非常有效。我想知道是否可以在如下事务中从AWSS3上传/删除文件:S3Object.transactiondo#writeintofiles#raiseanexceptionend引发异常后,每个操作都应在S3上回滚。S3Object这可能吗?? 最佳答案 虽然S3API具有批量删除功能,但它不支持事务,因为每个删除操作都可以独立于其他操作成功/失败。该API不提供任何批量上传功能(通过PUT或POST),因此每个上传操作都是通过一个独立的API调用完成的