虽然我知道要问一点有点傻,但我还是想更多地询问它的技术观点.
无限循环的一个简单示例:
public class LoopInfinite {
public static void main(String[] args) {
for (;;) {
System.out.println("Stack Overflow");
}
}
}
Run Code Online (Sandbox Code Playgroud)
如何从这个类的外部中断(停止)这个无限循环(例如,在继承的帮助下)?
在Java中杀死进程的最佳方法是什么?
获取PID然后用它杀死它Runtime.exec()?
用destroyForcibly()吗?
这两种方法有什么区别,还有其他解决方案吗?
我对高级Java缺乏经验,所以请耐心等待.
我很好奇Java能够实现可能被称为"自主"的功能.假设我们有两个Java程序在运行.并且一个程序确定另一个程序正在占用内存,从而杀死该程序和/或为JVM分配更多内存.
我知道在Java中你可以看到可用的内存是什么(请参阅如何检查Java中的CPU和内存使用情况?),但是如果我们想深入挖掘怎么办?
谢谢.
我正在使用java Runtime.exec()方法来执行bat文件,在bat文件中我已经编写了执行jar的代码.这个jar包含将无限时间汇集到rabbitmq队列的线程类,如果找到消息然后对其执行操作,则意味着这个过程将无限运行.我想使用java代码杀死这个进程,我也想知道这个方法能够执行在Linux Os上的脚本.
**Used java code**
String myCMD = "cmd.exe /C start c:\\elasticmgmtservice.bat";
Runtime rt = Runtime.getRuntime();
Process proc = rt.exec(myCMD);
**used batch file**
cd c:
cd ElasticMgmtService\
java -jar ElasticIndexManagementService.jar config\ElasticIndexManagementService.xml
Run Code Online (Sandbox Code Playgroud)
请帮我解决问题.
我正在尝试创建一种控制台/终端,允许用户输入一个字符串,然后将其转换为一个进程并打印出结果.就像一个普通的控制台.但我无法管理输入/输出流.我已经研究过这个帖子,但是这个解决方案很遗憾不适用于我的问题.
与"ipconfig"和"cmd.exe"等标准命令一起,我需要能够运行脚本并使用相同的输入流来传递一些参数,如果脚本要求输入的话.
例如,在运行脚本"python pyScript.py"之后,如果它要求它(例如:raw_input),我应该能够将更多输入传递给脚本,同时还打印脚本的输出.您期望终端的基本行为.
到目前为止我得到了什么:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextPane;
import javax.swing.text.BadLocationException;
import javax.swing.text.Document;
public class Console extends JFrame{
JTextPane inPane, outPane;
InputStream inStream, inErrStream;
OutputStream outStream;
public Console(){
super("Console");
setPreferredSize(new Dimension(500, 600));
setLocationByPlatform(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// GUI
outPane = new JTextPane();
outPane.setEditable(false);
outPane.setBackground(new Color(20, 20, 20));
outPane.setForeground(Color.white);
inPane = new JTextPane(); …Run Code Online (Sandbox Code Playgroud) 我在Java应用程序中使用ProcessBuilder创建进程.创建的进程执行一些FFMPEG命令,这些命令实际上将RTSP流复制到指定的目标媒体文件中.
ProcessBuilder builder = new ProcessBuilder("ffmpeg", "-i", RTSP_URL, "-f", fileFormat, destFilePath);
Process processToExecute = builder.start();
Run Code Online (Sandbox Code Playgroud)
我想在完成执行之前关闭该进程.因此,如果我直接在Windows CMD中运行此FFMPEG命令,然后在5秒后按"CTRL + C",则进程get终止,状态为"2".我可以播放到目前为止创建的媒体文件.
所以,如果我在Java应用程序中执行相同的操作:
process.destroy(); //I call this method after 5 sec
Run Code Online (Sandbox Code Playgroud)
我得到状态代码'1',这意味着异常终止.我通过以下方式获得状态:
processToExecute.destroy();
processToExecute.exitValue(); //This return me status '1'
Run Code Online (Sandbox Code Playgroud)
我无法播放媒体文件,我认为这是由于该过程的异常终止.
那么我如何终止使用ProcessBuilder创建的进程,就像我们在CMD中使用(CTRL + C)一样,以便我可以播放创建的媒体文件?
我想在Java应用程序中终止进程(使用ProcessBuilder创建),状态代码为'2',这是我在使用CMD终止进程时获得的.
因此,当我尝试在应用终止后删除该文件时,我收到以下错误:
The Action Can't be Performed Because File is Opened in FFMPEG.exe
Run Code Online (Sandbox Code Playgroud)
这意味着该进程不会终止它正在执行的命令.该命令仍然占用了这个文件,这就是为什么我无法播放它.当我打电话时,进程终止:
processToExecute.destroy();
Run Code Online (Sandbox Code Playgroud)
但是,它正在执行的任务(即执行命令)仍然有效.奇怪!!!!
实际上如果我在进程运行时直接在cmd中按'CTRL + C'或'q',那么它会成功终止进程,并且此进程在当前正在执行的进程列表中不再可见.
并以编程方式调用方法:
cmd> processToExecute.destroy();
Run Code Online (Sandbox Code Playgroud)
它终止了进程,但当我看到当前正在执行的进程列表时,我仍然可以在那里看到它们.
并存在相同的情况如果我尝试使用另一个CMD中的'taskkill'或'kill'命令终止此过程,方法是指定其进程异常终止的名称或pid.
PS我使用以下命令查看正在运行的进程:
tasklist
Run Code Online (Sandbox Code Playgroud)
因此,它证明了来自Application的destroy()方法和来自另一个CMD的'taskkill或kill'命令通常不会按"CTRL + C"和"q"来终止该过程.
到目前为止我有这个:
public static void main(String[] args) {
try {
String line;
Process p = Runtime.getRuntime().exec(
System.getenv("windir") + "\\system32\\" + "tasklist.exe");
BufferedReader input = new BufferedReader(new InputStreamReader(
p.getInputStream()));
while ((line = input.readLine()) != null) {
System.out.println(line); // <-- Parse data here.
}
input.close();
} catch (Exception err) {
err.printStackTrace();
}
Scanner killer = new Scanner(System.in);
int tokill;
System.out.println("Enter PID to be killed: ");
tokill = killer.nextInt();
}
Run Code Online (Sandbox Code Playgroud)
}
我希望能够根据用户输入的PID终止进程.我怎样才能做到这一点?(只需要在Windows上工作).*注意:必须能够杀死任何进程,inc.SYSTEM进程,所以如果使用taskkill.exe执行此操作,我猜测将需要-F标志?
所以,如果我有
Runtime.getRuntime().exec("taskkill /F /PID 827");
Run Code Online (Sandbox Code Playgroud)
如何用我的tokill变量替换"827"?
方案是我手动启动命令提示符。然后,我需要使用Java自动关闭命令提示符。我如何使用Java关闭命令提示符。任何人都可以帮助我
嗨,所以我是高中生,并且有一个与CS有关的项目.我正在尝试编写一个程序,在经过一段时间后关闭外部应用程序.那个时间部分很容易做,但现在问题是实际关闭问题.我环顾四周,找不到任何对我有用的东西,需要一些帮助.
这是我到目前为止所拥有的:
import java.util.concurrent.TimeUnit;
import javax.swing.JOptionPane;
public class TaskKiller {
public static void main(String[] args) {
JOptionPane pane = new JOptionPane();
String userInput1 = JOptionPane.showInputDialog("Hours: ");
String userInput2 = JOptionPane.showInputDialog("Minutes: ");
String userInput3 = JOptionPane.showInputDialog("Seconds: ");
long inputHours = Long.parseLong(userInput1);
long inputMinutes = Long.parseLong(userInput2);
long inputSeconds = Long.parseLong(userInput3);
long hours = inputHours * 3600000;
long minutes = inputMinutes * 60000;
long seconds = inputSeconds * 1000;
long time = (hours + minutes) + seconds;
try {
TimeUnit.MILLISECONDS.sleep(time);
System.exit(0);//was just an …Run Code Online (Sandbox Code Playgroud) 我有一个创建子进程的 Java Swing 应用程序。主 Swing 应用程序有一个停止按钮,点击该按钮后应立即终止子进程。“process.destroy()”不起作用。
Process myProcess = new ProcessBuilder("java", "-classpath", System.getProperty("java.class.path"), "MyClass.java");
try {
myProcess.waitFor();
}
catch (Exception e) {
e1.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)
...
myStopButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
myProcess.destroyForcibly();
// myProcess is a really long and complex process. So I could not destroy that using process.destroyForcibly().
}
}
Run Code Online (Sandbox Code Playgroud)
java ×10
process ×5
windows ×3
destroy ×1
ffmpeg ×1
inputstream ×1
jvm ×1
kill ×1
kill-process ×1
loops ×1
memory ×1
outputstream ×1
runtime.exec ×1
swing ×1
terminate ×1