Java 一个接一个、一次执行一个方法
我想在一个按钮内执行许多方法,但有些方法需要较少的时间,有些方法需要更多的时间来处理,我希望它们在一个方法处理另一个方法输出时按特定顺序运行。我的按钮执行如下:-Java 一个接一个、一次执行一个方法,java,multithreading,user-interface,Java,Multithreading,User Interface,我想在一个按钮内执行许多方法,但有些方法需要较少的时间,有些方法需要更多的时间来处理,我希望它们在一个方法处理另一个方法输出时按特定顺序运行。我的按钮执行如下:- { Basic b = new Basic(); b.method1(); //Normal processing b.method2(); //Normal processing b.method3(); //Heavy processing takes a lot of time like 5 to 10sec b.method
{
Basic b = new Basic();
b.method1(); //Normal processing
b.method2(); //Normal processing
b.method3(); //Heavy processing takes a lot of time like 5 to 10sec
b.method4(); //Basic processing
b.method5(); //Medium Processing FileHandling(works on 5 file)
}
所以发生的事情是,在执行method2之前,一切都很完美,但在执行method3之前,一切都变得一团糟。所以我想发生的事情是,我的method3被跳过,method4和method5被执行,结果给了我一个空指针异常,因为它们取决于从方法3
有人能告诉我如何确保我的方法4和5只在我的方法3完成后运行,并且仅供参考,我的方法3包含来自不同类的两个方法一个生成一些脚本,另一个执行它,因为它使用bash shell,需要实时运行
附言-当我的按钮执行完成时,我看到我的method3没有做任何类似被跳过或其他的事情
代码:-
public void method3(String abstarpath,String filename,String parapth)
{
try{
String cmd1 = "tar xzf "+abstarpath;
String cmd2 = "mv "+ parapth+"/"+filename +" /home/apoorv/Desktop/";
txtarea.append("#"+cmd1+"\n");
txtarea.append("#"+cmd2+"\n");
executeCommands(cmd1, cmd2);
}catch(Exception e){
txtarea.append("#"+e+"\n");
e.printStackTrace();
}
txtarea.append("\n");
}
public void executeCommands(String cmd1,String cmd2) throws IOException {
File tempScript = createTempScript(cmd1,cmd2);
try {
ProcessBuilder pb = new ProcessBuilder("bash", tempScript.toString());
pb.inheritIO();
Process process = pb.start();
process.waitFor();
} catch (InterruptedException e) {
txtarea.append("#"+e+"\n");
e.printStackTrace();
} finally {
tempScript.delete();
}
}
public File createTempScript(String cmd1,String cmd2) throws IOException {
File tempScript = File.createTempFile("script", null);
Writer streamWriter = new OutputStreamWriter(new FileOutputStream(
tempScript));
PrintWriter printWriter = new PrintWriter(streamWriter);
printWriter.println("#!/bin/bash");
printWriter.println(cmd1);
printWriter.println(cmd2);
printWriter.close();
return tempScript;
}
查看您的代码,您遇到的问题似乎与并发无关。问题是主方法不知道
methodX()
方法是否成功完成
您可以做的是将异常处理移动到主方法:
try {
Basic b = new Basic();
b.method1(); //Normal processing
b.method2(); //Normal processing
b.method3(); //Heavy processing takes a lot of time like 5 to 10sec
b.method4(); //Basic processing
b.method5(); //Medium Processing FileHandling(works on 5 file)
}
catch (Exception e) {
// error handling
}
(当然,您必须从其他方法中删除异常处理)
然后,一旦其中一个方法抛出异常,将跳过其余方法并执行异常处理程序。这将帮助您解决此问题
static void Main(string[] args)
{
SynchronizationContext.SetSynchronizationContext(new SynchronizationContext());
Task.Factory.StartNew(() =>
{
return Method1();
}).ContinueWith((t) => {
return Method2(t.Result.ToString());
}).ContinueWith((p) =>
{
return Method3(p.Result.ToString());
}, TaskScheduler.FromCurrentSynchronizationContext());
Console.ReadLine();
}
public static string Method1()
{
for(int i =0;i<20;i++)
{
Thread.Sleep(400);
Console.WriteLine("Working in Method1");
}
return "return from method1";
}
public static string Method2(string input)
{
for (int i = 0; i < 30; i++)
{
Thread.Sleep(600);
Console.WriteLine(input + " to Method 2");
}
return "Input from Method2";
}
public static string Method3(string input)
{
for (int i = 0; i < 50; i++)
{
Thread.Sleep(300);
Console.WriteLine(input + " to Method 3");
}
return "Input from Method3";
}
}
static void Main(字符串[]args)
{
SetSynchronizationContext(新的SynchronizationContext());
Task.Factory.StartNew(()=>
{
返回方法1();
}).ContinueWith((t)=>{
返回方法2(t.Result.ToString());
}).ContinueWith((p)=>
{
返回方法3(p.Result.ToString());
},TaskScheduler.FromCurrentSynchronizationContext());
Console.ReadLine();
}
公共静态字符串Method1()
{
对于(int i=0;ii如果您的观察结果是正确的,那么method3代码内部一定存在一些并发性。检查线程创建或该方向的其他情况。然后检查是否可以等待它完成。@Ap00rv不,我们不能。您需要在method3中显示更多代码。如何处理这一问题在很大程度上取决于您正在执行的操作顺便说一句:如果涉及大量处理,您不应该在EDT上执行这些操作。创建一个异步方法,在后台线程上执行所有操作。为了避免在此期间再次点击按钮,您可以在任务运行时禁用它。请参阅:所示代码段以顺序方式调用所有方法-一个接一个另一个。除非这些方法没有涉及线程,否则代码将按预期工作。但如果涉及一些线程,则代码的某些部分可能会并发运行。这在很大程度上取决于这些方法中的代码。因此,请显示它们的代码(或者可能是它们代码的重要部分)。否则,我们无法帮助您。嗯,waitFor
应该会一直阻止,直到流程完成……我没有看到明显的错误。