通过juc下LockSupport,可以达到阻塞和唤醒线程的操作
LockSupport是juc下一个线程阻塞唤醒的工具类。它的主要方法有:
每个使用LockSupport的线程,会有一个许可;调用park会立即返回,否则会被阻塞。
如果许可不可用,则可以调用unpark供其可使用,但是许可不可重入,例如在park()后接着park(),这样做可能会导致线程永远无法唤醒。
对于park和unpark来说,它们本身就是一个阻塞和唤醒的实现,但是值得注意的是,一个线程的最大许可只会有一个。
unpark:对于已经开始的线程,设置一个许可,对于未开始的线程可能不会有效果。
park:如果当前线程许可>0 ,那么会继续执行,否则就会阻塞等待。什么时候会被唤醒?调用unpark对当前线程,或interrupt当前线程。
所以,park在业务中 我们尽量保证将线程放在循环中,并前置校验当前的状态。
public final native void wait(long timeout) throws InterruptedException;
public final void wait() throws InterruptedException
public final void wait(long timeout, int nanos) throws InterruptedException
首先说说wait,wait提供了几种重载方法,最终都会执行wait(time)的方法,它是属于Object包下的,调用它会导致当前线程阻塞,直到其他线程调用notify、notifyAll或等待执行时间自动唤醒,并且wait必须在同步块中使用,而且会释放锁。
notify,用于唤醒wait的线程,如果没有wait的线程则会忽略,并且唤醒的线程会重新获取锁。notifyAll会唤醒所有持有相同的锁的阻塞线程同时唤醒进行竞争消费。
但是这里又有wait和sleep的区别:
wait sleep都可以让线程阻塞,并且都可被中断。
sleep是Thread下的方法,而wait是Object的 而且wait比如在同步代码块中执行。
sleep时,并不会释放锁,而wait会释放锁。
sleep在指定时间后会主动退出,而wait如果不设置时间自动唤醒会一直阻塞。
如何在一个线程中暂停另一个线程的运行?
stop方法?stop已经被禁用,因为stop是强行终止挂起线程,但是这种方式是很危险的,比如线程还没来得及释放锁,那其他线程将永远获取不到资源。
所以我们要使用interrupt, 它不会像stop一样中断一个正在运行的线程,而线程会执行下去,但会设置线程中的中断状态,线程会一直检测这个标记量以判断线程是否需要被立即终止。
但是,如果在一个阻塞线程中使用interrupt, 会产生一个InterruptedException异常,结束线程的运行。如果我们自定义捕获异常后,可以做一些额外工作,如终止、继续等
所以,interrupt一般用在线程中的循环中,控制线程中断的状态。
经过上文介绍,我们对wait、notify和LockSupport有了基本的认识。那我们推荐使用哪种方式呢?
举个例子,例如线程B要通知线程A唤醒,那么前置条件是什么?是要确保线程A必须开始并且持有相同的锁并且已经被阻塞了。那么如果线程A这时候没有达到这个条件,而后续达到了这个条件,那么线程B在notify时无法唤醒线程A,而线程A可能也面临永远无法唤醒的情况。那这种情况如果用LockSupport去处理会有什么好处呢?如果我们用park、unpark,那么在线程启动后,如果unpark在前,那么会在线程中添加一个许可,最大也只能有一个许可,这时如果达到了park条件,发现已经有许可就会继续执行;而如果线程先被park,那就会阻塞,直到被unpark唤醒。
但是这里需要注意一个问题,如果我们多次park会怎么样?如果我们又unpark了多次会怎么样?
其实对于LockSupport来说,park和unpark其实就是重置了内部的一个count,调用park会将count重置为0,那么如果重置之前是1,则直接退出,否则就被阻塞;调用unpark时,会将count重置为1,那么如果重置之前是0就将线程唤醒,否则直接退出。
所以,如果我们多次park和unpark后,会导致线程无法被唤醒。
推荐先park、后unpark。
尝试通过RVM将RubyGems升级到版本1.8.10并出现此错误:$rvmrubygemslatestRemovingoldRubygemsfiles...Installingrubygems-1.8.10forruby-1.9.2-p180...ERROR:Errorrunning'GEM_PATH="/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/ruby-1.9.2-p180@global:/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/rub
我在我的Rails项目中使用Pow和powifygem。现在我尝试升级我的ruby版本(从1.9.3到2.0.0,我使用RVM)当我切换ruby版本、安装所有gem依赖项时,我通过运行railss并访问localhost:3000确保该应用程序正常运行以前,我通过使用pow访问http://my_app.dev来浏览我的应用程序。升级后,由于错误Bundler::RubyVersionMismatch:YourRubyversionis1.9.3,butyourGemfilespecified2.0.0,此url不起作用我尝试过的:重新创建pow应用程序重启pow服务器更新战俘
我实际上是在尝试使用RVM在我的OSX10.7.5上更新ruby,并在输入以下命令后:rvminstallruby我得到了以下回复:Searchingforbinaryrubies,thismighttakesometime.Checkingrequirementsforosx.Installingrequirementsforosx.Updatingsystem.......Errorrunning'requirements_osx_brew_update_systemruby-2.0.0-p247',pleaseread/Users/username/.rvm/log/138121
我最近决定从我的系统中卸载RVM。在thispage提出的一些论点说服我:实际上,我的决定是,我根本不想担心Ruby的多个版本。我只想使用1.9.2-p290版本而不用担心其他任何事情。但是,当我在我的Mac上运行ruby--version时,它告诉我我的版本是1.8.7。我四处寻找如何简单地从我的Mac上卸载这个Ruby,但奇怪的是我没有找到任何东西。似乎唯一想卸载Ruby的人运行linux,而使用Mac的每个人都推荐RVM。如何从我的Mac上卸载Ruby1.8.7?我想升级到1.9.2-p290版本,并且我希望我的系统上只有一个版本。 最佳答案
我完全不是程序员,正在学习使用Ruby和Rails框架进行编程。我目前正在使用Ruby1.8.7和Rails3.0.3,但我想知道我是否应该升级到Ruby1.9,因为我真的没有任何升级的“遗留”成本。缺点是什么?我是否会遇到与普通gem的兼容性问题,或者甚至其他我不太了解甚至无法预料的问题? 最佳答案 你应该升级。不要坚持从1.8.7开始。如果您发现不支持1.9.2的gem,请避免使用它们(因为它们很可能不被维护)。如果您对gem是否兼容1.9.2有任何疑问,您可以在以下位置查看:http://www.railsplugins.or
我在我的rails应用程序中安装了来自github.com的acts_as_versioned插件,但有一段代码我不完全理解,我希望有人能帮我解决这个问题class_eval我知道block内的方法(或任何它是什么)被定义为类内的实例方法,但我在插件的任何地方都找不到定义为常量的CLASS_METHODS,而且我也不确定是什么here,并且有问题的代码从lib/acts_as_versioned.rb的第199行开始。如果有人愿意告诉我这里的内幕,我将不胜感激。谢谢-C 最佳答案 这是一个异端。http://en.wikipedia
我们有一个目前在Rails2.3.12版和Ruby1.8.7版上运行的应用程序。我们想将我们的应用程序更新到Rails4.0和Ruby2.1.0。我们有大约200个模型和150个Controller。我想知道升级过程需要多大的努力。您还可以提供升级可以遵循的步骤。我们应该先升级Ruby然后再升级Rails还是相反? 最佳答案 您想要实现的目标将是史诗般的努力。我无法为您提供分步说明,因为不可能在一个答案中涵盖所有情况。我建议不要同时升级Ruby和Rails,而是分步升级。升级本身的复杂性是巨大的,但只要您的应用程序具有合理的测试覆盖
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭9年前。我最近开始学习Ruby,这是我的第一门编程语言。我对语法感到满意,并且我已经完成了许多只教授相同基础知识的教程。我已经写了一些小程序(包括我自己的数组排序方法,在有人告诉我谷歌“冒泡排序”之前我认为它非常聪明),但我觉得我需要尝试更大更难的东西来理解更多关于Ruby.关于如何执行此操作的任何想法?
我在Ruby中遇到了一个关于Dir[]和File.join()的简单程序,blobs_dir='/path/to/dir'Dir[File.join(blobs_dir,"**","*")].eachdo|file|FileUtils.rm_rf(file)ifFile.symlink?(file)我有两个困惑:首先,File.join(@blobs_dir,"**","*")中的第二个和第三个参数是什么意思?其次,Dir[]在Ruby中有什么用?我只知道它等价于Dir.glob(),但是,我对Dir.glob()确实不是很清楚。 最佳答案
1.回顾.TransportServicepublicclassTransportServiceextendsAbstractLifecycleComponentTransportService:方法:1publicfinalTextendsTransportResponse>voidsendRequest(finalTransport.Connectionconnection,finalStringaction,finalTransportRequestrequest,finalTransportRequestOptionsoptions,TransportResponseHandlerT>