一个接一个地执行方法,一次执行一个方法

时间:2016-07-04 07:03:39

标签: 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.method4(); //Basic  processing
b.method5(); //Medium Processing FileHandling(works on 5 file)
}

所以会发生的一切都是完美的,并且除了执行方法2之外,因为方法3它会变得混乱。所以我发生的事情是我的方法3被跳过而方法4和方法5被执行结束了给我一个空指针异常,因为它们取决于从执行method3收到的数据。

有人可以告诉我如何确保我的方法4和5仅在我的方法3完成后运行,而FYI我的方法3包含来自不同类别的两个方法,这些方法生成一些脚本而另一个方法执行它时间,因为它使用bash shell。

P.S.-当我的按钮执行完成后,我看到我的方法3没有做过类似的事情已经被跳过了。

代码: -

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;
}

2 个答案:

答案 0 :(得分:1)

查看您的代码,您遇到的问题似乎与并发无关。问题是您的main方法不知道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
}

(当然,您必须从其他方法中删除异常处理。)

然后,只要其中一个方法抛出异常,就会跳过其余的方法并执行异常处理程序。

答案 1 :(得分:1)

这将帮助你

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";
    }
}