每当我试图从线程 A 中杀死线程 B(通常,有时它会起作用)时,我的 Android 应用程序中都会出现线程锁定问题,原因仍然未知。我猜这是因为我的一些方法在没有同步的情况下跨线程调用。我使取消方法和许多本质上是事件处理程序的方法同步,并使一些共享变量可变,一切正常。
我不知道我添加的 20 个奇怪的 volatile/synchronized 声明中的哪个实际上解决了这个问题,这让我想“我应该关心吗?它有效,不要乱用它!”
所以,我的问题是:是否有与声明方法同步或原始 volatile 相关的权衡?如果不需要这些声明,是否有任何理由避免这些声明?
编辑
有问题的线程是正在接收/发送流数据的蓝牙连接,因此 ASyncTask 和其他工作线程类型的解决方案无法正常工作。它们被设计用于执行有限的任务并在完成时终止。有些,如 ASyncTask,还会增加很多开销,这只会杀死应用程序。对于像这样连续运行的线程,使用 Thread 仍然是最好的方法。
我正在使用安卓Service生成和管理线程,因此我在这方面遵循 Android 设计范例。
最佳答案
根据我的经验,使用 synchronized(object){...} 来访问特定对象,以尽可能细粒度的级别进行锁定通常更容易且通常更高效。此外,如果您必须同时获取多个锁,请始终确保您始终以相同的顺序获取它们。
静态方法有其自身的怪异之处需要担心;一个同步的实例方法只会同步到那个实例,而不是整个类,所以如果你需要在一个实例方法中同步到两者,你需要做一些类似 synchronized(this.class){.. .} 同样,尽管如果您应用上述方法,实际上您只是对您在特定方法中访问的静态字段执行 synchronized()。
另外请注意,通常您不希望产生自己的线程,而应该使用系统预先存在的线程管理机制(例如用于正在进行的工作队列的 ThreadPoolExecutor 或用于异步 UI 更新的 AsyncTask)。 ThreadPoolExecutor 往往性能更高(并且可以更好地利用多核设备),但是如果它要对 UI 做一些事情,您必须做一些额外的工作;另一方面,AsyncTask 往往有点慢且更重量级,但它也在 UI 线程中运行其 onPostExecute 回调。
关于java - 与在 java 中声明同步的方法进行权衡?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6849361/
我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div
总的来说,我对ruby还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用
类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
很好奇,就使用rubyonrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提
我正在尝试设置一个puppet节点,但rubygems似乎不正常。如果我通过它自己的二进制文件(/usr/lib/ruby/gems/1.8/gems/facter-1.5.8/bin/facter)在cli上运行facter,它工作正常,但如果我通过由rubygems(/usr/bin/facter)安装的二进制文件,它抛出:/usr/lib/ruby/1.8/facter/uptime.rb:11:undefinedmethod`get_uptime'forFacter::Util::Uptime:Module(NoMethodError)from/usr/lib/ruby
在控制台中反复尝试之后,我想到了这种方法,可以按发生日期对类似activerecord的(Mongoid)对象进行分组。我不确定这是完成此任务的最佳方法,但它确实有效。有没有人有更好的建议,或者这是一个很好的方法?#eventsisanarrayofactiverecord-likeobjectsthatincludeatimeattributeevents.map{|event|#converteventsarrayintoanarrayofhasheswiththedayofthemonthandtheevent{:number=>event.time.day,:event=>ev
我想了解Ruby方法methods()是如何工作的。我尝试使用“ruby方法”在Google上搜索,但这不是我需要的。我也看过ruby-doc.org,但我没有找到这种方法。你能详细解释一下它是如何工作的或者给我一个链接吗?更新我用methods()方法做了实验,得到了这样的结果:'labrat'代码classFirstdeffirst_instance_mymethodenddefself.first_class_mymethodendendclassSecond使用类#returnsavailablemethodslistforclassandancestorsputsSeco
我在我的项目中添加了一个系统来重置用户密码并通过电子邮件将密码发送给他,以防他忘记密码。昨天它运行良好(当我实现它时)。当我今天尝试启动服务器时,出现以下错误。=>BootingWEBrick=>Rails3.2.1applicationstartingindevelopmentonhttp://0.0.0.0:3000=>Callwith-dtodetach=>Ctrl-CtoshutdownserverExiting/Users/vinayshenoy/.rvm/gems/ruby-1.9.3-p0/gems/actionmailer-3.2.1/lib/action_mailer
我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当
设置:狂欢ruby1.9.2高线(1.6.13)描述:我已经相当习惯在其他一些项目中使用highline,但已经有几个月没有使用它了。现在,在Ruby1.9.2上全新安装时,它似乎不允许在同一行回答提示。所以以前我会看到类似的东西:require"highline/import"ask"Whatisyourfavoritecolor?"并得到:Whatisyourfavoritecolor?|现在我看到类似的东西:Whatisyourfavoritecolor?|竖线(|)符号是我的终端光标。知道为什么会发生这种变化吗? 最佳答案