如何在CLI(命令行界面)Java应用程序中拦截 Ctrl + C(通常会终止进程)?
是否存在多平台解决方案(Linux,Solaris,Windows)?
我使用Console的readLine(),但如果有必要,我会用一些其他的方法来读取从标准输入的字符.
回复到我最近的问题表明,一个演员处理其消息一次一个.这是真的?我没有看到任何明确说明(在Scala中编程),其中包含以下代码段(第593页)
如果[
react方法]找到可以处理的消息,[it]将调度该消息的处理以便以后执行并抛出异常
(强调我自己).两个相关(和互斥)的问题:
receive?)编辑:做一些测试似乎证明我错了,演员确实是连续的.所以问题#2我需要回答
我用Java启动子进程如下:
final String[] cmd = {"<childProcessName>"};
Process process = Runtime.getRuntime().exec(cmd);
Run Code Online (Sandbox Code Playgroud)
它现在在后台运行.一切都好又好.
如果我现在的程序崩溃(这是仍然在开发中:-))子进程似乎仍流连.如何在父Java进程终止时自动结束?
如果它有帮助,我使用的是Mac OS X 10.5
在Scala 2.8中,当我开始演员时,我可以通过消息传递进行通信.这反过来意味着我可以发送最终的Exit()消息或我认为适合我的协议的任何内容.
但是我如何检查演员是否退出?我可以很容易地想象自己有一个任务,其中一个主演员开始一些工人演员,然后只是等待答案,每次检查这是否是最终的答案(即任何演员仍在工作或他们都退出?).
当然,我可以让他们都发回"我已经完成"的消息,然后计算它们,但这在某种程度上是令人不满意的.
在测试工人演员的完成时,最佳做法是什么?
编辑#1
嘿伙计们,我正在考虑期货,但遇到了麻烦.有人可以解释为什么这段代码不起作用:
package test
import scala.actors.Futures._
object FibFut extends Application{
def fib(i:Int):Int =
if(i<2)
1
else
fib(i-1)+fib(i-2)
val f = future{ fib(3) }
println(f())
}
Run Code Online (Sandbox Code Playgroud)
如果我在future-body中定义函数fib,它就可以工作.它必须是范围的东西,但我没有上面的任何错误,它只是挂起.任何人?
编辑#2
似乎扩展应用程序并不是一个好方法.定义主要方法使一切正常.以下代码是我正在寻找的,所以Futures得到了大拇指:)
package test
import scala.actors.Futures._
object FibFut {
def fib(i: Int): Int = if (i < 2) 1 else fib(i - 1) + fib(i - 2)
def main(args: Array[String]) {
val fibs = for (i <- 0 to 50) yield future { fib(i) }
for (future …Run Code Online (Sandbox Code Playgroud) actor ×2
java ×2
scala ×2
command-line ×1
concurrency ×1
copy-paste ×1
exit ×1
runtime ×1
scala-2.8 ×1
shutdown ×1
stdin ×1
subprocess ×1