我有一个使用FileReader打开文件的Java进程.如何防止另一个(Java)进程打开此文件,或者至少通知第二个进程该文件已被打开?如果文件是打开的(这解决了我的问题),这是否会自动使第二个进程获得异常,或者我是否必须在第一个进程中使用某种标志或参数显式打开它?
我有一个Java应用程序,它列出了一个文件夹,并打开列表中的每个文件进行处理.它会逐个处理每个文件.每个文件的处理包括读取它并根据内容进行一些计算,大约需要2分钟.我还有另一个Java应用程序执行相同的操作,而是写入文件.我想要的是能够同时运行这些应用程序,所以场景就是这样的.ReadApp列出文件夹并找到文件A,B,C.它打开文件A并开始读取.WriteApp列出文件夹并找到文件A,B,C.它打开文件A,看到它是打开的(通过异常或任何方式)并转到文件B. ReadApp完成文件A并继续到B.它看到它是开放的,继续到C. WriteApp没有至关重要 当ReadApp读取同一文件时写入,反之亦然.它们是不同的过程.
我已经开始使用以下代码进行处理
ProcessBuilder pb = new ProcessBuilder("cmd", "/c", "path");
try {
Process p = pb.start();
}
catch (IOException ex) {}
Run Code Online (Sandbox Code Playgroud)
现在我需要知道我刚刚开始的进程的pid.
我想知道是否有可能从代码中获取用于启动java程序的命令.
例如,如果我启动一个java程序:
java -cp lib1:lib2:... -jar mylib.jar com.foo.Bar
Run Code Online (Sandbox Code Playgroud)
我想得到确切的字符串(包括jvm参数).
可能吗?
评论赏金和问题
谢谢大家的回复.不幸的是,我没有得到我最初寻找的答案.我希望有一些可移植的解决方案从程序本身(包括类路径等)中获取完整的java命令.因为似乎没有可移植的解决方案,因为我使用Linux,我使用agodinhost和Luigi R. Viggiano的响应来解决我的问题.然而,我将赏金给予rahulroc以获得最完整(便携)的响应.其余为所有人的upvote :)
我在Windows上使用Eclipse,使用PyDev插件进行Python开发.当我使用'Run'启动我的应用程序时,它会产生一个新的Python(CPython)实例.当我使用'终止'按钮(红色方块)时,它会终止进程.但是,它似乎执行SIGKILL,因此我的关闭处理程序无法清理.
有没有办法让Eclipse发送SIGTERM,或者从Eclipse控制台模拟键盘中断(ctrl-c)?
注意:我知道还有其他Python IDE,比如Komodo或Wing可以解决这个问题,但我不打算转换它.
我需要在Linux平台上找到当前运行进程的PID(它可以是依赖于系统的解决方案).Java不支持获取进程ID,JRuby目前有一个Ruby方法的错误,即Process.pid.
还有其他方法可以获得PID吗?
Java代码如何为运行它的JVM获取唯一标识符?在Unix系统上,我正在寻找的一个例子是运行JVM的进程的PID(假设JVM和进程之间的一对一映射).
我有一个Java应用程序,其中创建了一些线程(via new Thread()).使用ps我可以看到他们有不同的线程ID(LWP列),我想从Java应用程序中获取这些ID.
在我找到的与此主题相关的大多数帖子中(例如,这个),解决方案是使用ManagementFactory.getRuntimeMXBean().getName().
但是,使用该方法可以获得主线程的PID(即使我从其中一个线程调用它),因此它并没有真正解决我的问题.
有没有办法获取Thread应用程序创建的每个单独的线程ID ?
是否可以使用JNI来完成它?如果我可以以某种方式连接到我可以调用的C函数syscall(__NR_gettid),那可以解决我的问题.我真的不关心可移植性,所以我完全可以使用只适用于Linux机器的解决方案.
更新:我实际上已经通过使用JNI解决了我的问题.细节在我的回答中解释.谢谢大家的建议/意见.
我想创建一个跟踪内存使用情况和CPU使用情况的线程.
如果应用程序达到高级别,我想生成堆转储或线程转储.
有没有办法生成线程转储运行时而不重新启动?
我正在从IntelliJ Idea开始一个java程序,它使用的.dll是我用C++编写的.在应用程序启动后,我可以使用Microsoft Visual Studio(Debug/Attach to Process ...)附加到进程,这允许我调试正在运行的应用程序的C++部分.
这个过程的名称很简单java.从所有java过程中选择正确的一个总是很痛苦.简单的任务管理器是不够的.该进程资源管理器是好的,但我仍然需要,直到我找到合适的人来检查多个进程.如果Idea只是告诉它启动的应用程序的PID,对我来说会容易得多.
Idea有这样的功能吗?
(赢得7 64位新鲜@ 2017-04-19,创意2017.1.1)