Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我正在尝试制作一个界面,在这里我们可以通过点击执行.exe文件来安装软件_Java_Multithreading_Javafx_Exe - Fatal编程技术网

Java 我正在尝试制作一个界面,在这里我们可以通过点击执行.exe文件来安装软件

Java 我正在尝试制作一个界面,在这里我们可以通过点击执行.exe文件来安装软件,java,multithreading,javafx,exe,Java,Multithreading,Javafx,Exe,这是我的主类,其中run(),我正在调用另一个方法install setup(),该方法用于exe文件 public static void main(String[] args) { launch(args); } public void startSetup() { Runnable task=new Runnable() { @Override public void run() { try {

这是我的主类,其中run(),我正在调用另一个方法install setup(),该方法用于exe文件

 public static void main(String[] args) {
    launch(args);
   }  
public void startSetup() {
Runnable task=new Runnable() {
        @Override
        public void run() {
            try {
                Thread.sleep(1000);
                installSetup();
            } catch (InterruptedException e) {
            e.printStackTrace();
            }

        }


    }; 

Thread thread=new  Thread(task);
thread.start();
}
这是我的installsetup()方法

我在控制器类中这样调用它:

public class Controller extends Thread {
  @FXML
    private ComboBox<?> dsetup;
  public void generateRandom() {
     if(dsetup.getValue()!=null) dsetupValue = dsetup.getValue().toString();
     if(dsetupValue!=null)call.startSetup();
公共类控制器扩展线程{
@FXML
专用组合框数据设置;
公共void generateradom(){
如果(dsetup.getValue()!=null)dsetupValue=dsetup.getValue().toString();
if(dsetupValue!=null)调用.startSetup();

在我只是用exec方法调用安装文件而不是用threads概念调用安装文件之前,应用程序运行正常,但它一次执行所有的.exe文件,然后我的界面冻结。因此,现在我使用threads概念,试图一次实现一个线程。我不明白这是否是一种错误的方法,但我不知道控制台中没有任何错误。

遗憾的是,exec有一些缺陷。大多数情况下,使用流程aproche(请参见清单4.3)可以避免与缓冲区问题等相关的问题。

import java.util.*;
导入java.io.*;
公共课平庸
{
公共静态void main(字符串参数[])
{
尝试
{            
Runtime rt=Runtime.getRuntime();
processproc=rt.exec(“javac”);
InputStream stderr=proc.getErrorStream();
InputStreamReader isr=新的InputStreamReader(stderr);
BufferedReader br=新的BufferedReader(isr);
字符串行=null;
System.out.println(“”);
而((line=br.readLine())!=null)
系统输出打印项次(行);
System.out.println(“”);
int exitVal=proc.waitFor();
System.out.println(“进程exitValue:+exitVal”);
}捕获(可丢弃的t)
{
t、 printStackTrace();
}
}
}
资料来源:javaworld


Runtime.exec已过时多年。请改用:

inheritIO()方法将使生成的进程使用Java程序的stdin、stdout和stderr,因此它不会挂起等待输入或等待可用的输出缓冲区


我怀疑您是否需要新线程或睡眠调用,但我不知道您调用的是什么文件,也不知道它们是否相互依赖。

此示例中有一些内容可以删除,因为您不需要忽略输出的输出来自子进程的数据将导致任何实际写入足够数据以填充其标准输出或标准错误管道缓冲区的子进程出现问题。由于数据无处可去,子进程可能会无限期阻塞。是的,我只是指额外的println调用,如
System.out.println(“进程exitValue:”+exitVal);
仅此而已。我将删除这一行,因为它不提供任何有用的信息。感谢您的评论,我将尝试它。感谢您的信息。我为所有安装文件制作了5个不同的线程。我需要按顺序运行安装程序。第二个安装程序需要一个安装程序。用于了解每个进程何时完成。
public class Controller extends Thread {
  @FXML
    private ComboBox<?> dsetup;
  public void generateRandom() {
     if(dsetup.getValue()!=null) dsetupValue = dsetup.getValue().toString();
     if(dsetupValue!=null)call.startSetup();
import java.util.*;
import java.io.*;
public class MediocreExecJavac
{
    public static void main(String args[])
    {
        try
        {            
            Runtime rt = Runtime.getRuntime();
            Process proc = rt.exec("javac");
            InputStream stderr = proc.getErrorStream();
            InputStreamReader isr = new InputStreamReader(stderr);
            BufferedReader br = new BufferedReader(isr);
            String line = null;
            System.out.println("<ERROR>");
            while ( (line = br.readLine()) != null)
                System.out.println(line);
            System.out.println("</ERROR>");
            int exitVal = proc.waitFor();
            System.out.println("Process exitValue: " + exitVal);
        } catch (Throwable t)
          {
            t.printStackTrace();
          }
    }
}
ProcessBuilder builder = new ProcessBuilder("C:\\path\\setup.exe");
builder.directory(new File("C:pathfolder\\01_Setupexe"));
builder.inheritIO();
builder.start();