2013-08-10 5 views
2

У меня есть один метод java, который содержит 5 различных внутренних методов. Для повышения производительности я хочу называть эти методы параллельными.Как выполнять различные методы параллельно

например. пробег способ1, способ2, ... способ5 параллель используя поток.

private void getInformation() throws SQLException, 
      ClassNotFoundException, NamingException { 
    method1(); 
    method2(); 
    method3(); 
    method4(); 
    method5(); 
} 

но все эти 5 методов имеют различную бизнес-логику.

+0

Запускать каждый метод под своим собственным потоком, предполагая, что они не имеют изменчивого состояния? –

+0

Спасибо за этот ответ, не могли бы вы рассказать или указать какой-либо пример ссылки :) – user1037452

+0

Здесь вы идете - http://www.vogella.com/articles/JavaConcurrency/article.html –

ответ

5

Сделайте примерно следующее:

  1. Для каждого метода создайте объект Callable, который обертывает этот метод.
  2. Создайте Исполнителя (исполнитель пула фиксированных потоков должен быть в порядке).
  3. Поместите все свои Callables в список и вызовите их с помощью Executor.

Вот простой пример:

public void testThread() 
{ 

    //create a callable for each method 
    Callable<Void> callable1 = new Callable<Void>() 
    { 
     @Override 
     public Void call() throws Exception 
     { 
     method1(); 
     return null; 
     } 
    }; 

    Callable<Void> callable2 = new Callable<Void>() 
    { 
     @Override 
     public Void call() throws Exception 
     { 
     method2(); 
     return null; 
     } 
    }; 

    Callable<Void> callable3 = new Callable<Void>() 
    { 
     @Override 
     public Void call() throws Exception 
     { 
     method3(); 
     return null; 
     } 
    }; 

    //add to a list 
    List<Callable<Void>> taskList = new ArrayList<Callable<Void>>(); 
    taskList.add(callable1); 
    taskList.add(callable2); 
    taskList.add(callable3); 

    //create a pool executor with 3 threads 
    ExecutorService executor = Executors.newFixedThreadPool(3); 

    try 
    { 
     //start the threads and wait for them to finish 
     executor.invokeAll(taskList); 
    } 
    catch (InterruptedException ie) 
    { 
     //do something if you care about interruption; 
    } 

} 

private void method1() 
{ 
    System.out.println("method1"); 
} 

private void method2() 
{ 
    System.out.println("method2"); 
} 

private void method3() 
{ 
    System.out.println("method3"); 
} 

Убедитесь, что каждый метод не разделяет состояние (как общее изменяемое поле в том же классе), или вы можете получить неожиданные результаты. Oracle обеспечивает a good introduction to Java Executors. Кроме того, this book является удивительным, если вы делаете какие-либо потоки в java.

+1

Все замечательно, и все, кроме ничего, ничего из 'List > futureList = executor.invokeAll (taskList);' будет выполнено, поэтому эти таймеры не Работа. – Yokhen

+0

Да, ты прав. Я обновил этот пример. – lreeder

0

Вы можете использовать инструмент параллелизма высокого уровня в Java-пуле потоков. Но в любом случае вам придется создавать Runnable objects (задачи), а затем использовать метод пула потоков - invokeAll(). Пожалуйста, обратите внимание на Oracle concurrency tutorial

+0

, но все эти 5 методов имеют разную бизнес-логику. – user1037452

+0

@ user1037452 Итак, в чем проблема с использованием пула потоков и «различной бизнес-логики»? Я не совсем понимаю ваши сомнения. Но похоже, что вам нужно прочитать некоторую базовую информацию о материалах параллелизма в java. – XZen

0

Вы должны использовать 5 различных потоков для параллельного выполнения ваших методов, код это не сложно, но довольно скучно.

Возможно, вы захотите взглянуть на Gpars Tasks, которые делают письменный параллельный код намного более простым и приятным.

http://gpars.org/1.0.0/guide/guide/dataflow.html#dataflow_tasks

2

Для запуска method1 параллельно, сделайте следующее:

Thread t1=new Thread() { 
    public void run() { 
     method1(); 
    } 
}; 
t1.start(); 

Сделайте это для всех методов.

Ждать method1 до конца, сделать

t1.join(); 

и поэтому для всех других потоков.

Многие люди скажут вам использовать ThreadPool и не продлевают тему - все это имеет мало смысла для вас сейчас. Учитесь так и только затем следуйте этим советам.

+0

вы не отвечаете на вопрос. –

Смежные вопросы