2016-07-04 8 views
2

Я хочу выполнить несколько методов внутри кнопки, но некоторые из них занимают меньше времени, а некоторые занимают больше времени для обработки, и я хочу, чтобы они запускали их в определенной последовательности как один метод работает на других методах output.My выполнения кнопки выглядит следующим образом: -Выполнение методов один за другим и один за раз

{ 
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 он получает все перепутались. Итак, я делаю то, что происходит, когда мой метод3 пропускается, а метод method4 и метод5 запускаются, что дает мне исключение нулевого указателя, поскольку они зависят от данных, полученных от выполнения метода3.

Может ли кто-нибудь сказать мне, как я могу убедиться, что мои методы 4 и 5 запускаются только после того, как мой метод3 завершен, а FYI мой метод3 содержит 2 метода из другого класса, который создает некоторые скрипты, а другой - тот, который выполняет в реальном времени, так как он использует оболочку bash.

P.S.-как закончилась моя кнопка.

Код: -

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

Если наблюдение правильно, то должен быть какой-то параллелизм происходит внутри кода method3. Проверьте создание темы или что-то в этом направлении. Затем проверьте, можете ли вы дождаться окончания. – Fildor

+0

, если 'method3' не является асинхронным, он должен работать так, как вы хотите, -' method4' должен начинаться после завершения 'method3'. похоже, может быть проблема в 'method3', можете ли вы разместить ее содержимое? – user5226582

+0

Так почему же этот метод не выполняется последовательно? –

ответ

1

Глядя на ваш код, проблема у вас возникли, кажется, не имеют ничего общего с параллелизмом. Проблема в том, что ваш основной метод не знает, успешно ли завершены методы 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

Это поможет вам

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"; 
    } 
} 
Смежные вопросы