2013-02-17 1 views
8

Простите меня, если вопрос звучит глупо - я только начинаю использовать Executor.Служба-исполнитель в java -> как конвертировать код с одним потоком для использования исполнителем

У меня есть существующий приложение Java, которое использует потоки в этом manner-- основном автономные потоки used--

private Thread spawnThread() 
    { 

     Thread t = new Thread() 
     { 
      String taskSnap = task.toString(); 
      public void run() 
      { 
       try 
       { 
        println(task.run(null)); 
       }catch(InterruptedException e) 
       { 
        println("ITC - " + taskSnap + " interrupted "); 
       } 
      } 
     }; 
     return t; 
    } 

Как видно из сказанного выше, функция возвращает новый поток.

Теперь в главной функции() программы, новый поток создается в этом manner--

taskThread = spawnThread(); 

    taskThread.start(); 

Что я хочу сделать, это, создать службу ИСПОЛНИТЕЛЬ (с фиксированным числом нитей) ->, а затем передать создание нового потока/выполнение задачи новым потоком этому исполнителю.

Поскольку я очень новичок в Executor, я хочу знать, как изменить приведенный выше код, чтобы вместо нового отдельного потока был создан новый поток в пуле потоков. Я не вижу никакой команды для создания потока (внутри пула потоков) -> передать указанную выше задачу этому потоку (а не отдельному потоку, как указано выше).

Пожалуйста, дайте мне знать, как решить эту проблему.

+0

Оберните раздел «run» вашей нити в интерфейсе Runnable. Создайте исполнителя и предложите Runnable. Просмотрите страницу [Исполнитель] (http://docs.oracle.com/javase/tutorial/essential/concurrency/executors.html) для получения дополнительной информации – MadProgrammer

ответ

8

В вашей основной, вы можете написать что-то вроде этого:

ExecutorService executor = Executors.newFixedThreadPool(nThreads); 
executor.submit(new Runnable() { 
    String taskSnap = task.toString(); 
    public void run() { 
      try { 
       println(task.run(null)); 
      } catch(InterruptedException e) { 
       println("ITC - " + taskSnap + " interrupted "); 
      } 
    } 
}); 

Способ представить выполнит Runnable на одной из нитей в рамках услуги исполнителя.

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

5

Сделайте свое исследование, прежде чем спрашивать. Идея заключается в создании класса, который реализует Runnable и выполняет его с использованием службы-исполнителя.

Пример из: Java Concurrency (Multithreading) - Tutorial

Осуществление работника (который реализует Runnable):

package de.vogella.concurrency.threadpools; 

/** * MyRunnable will count the sum of the number from 1 to the parameter * countUntil and then write the result to the console. * <p> * MyRunnable is the task which will be performed * * @author Lars Vogel * */ 

public class MyRunnable implements Runnable { 
    private final long countUntil; 

    MyRunnable(long countUntil) { 
    this.countUntil = countUntil; 
    } 

    @Override 
    public void run() { 
    long sum = 0; 
    for (long i = 1; i < countUntil; i++) { 
     sum += i; 
    } 
    System.out.println(sum); 
    } 
} 

Как использовать ИСПОЛНИТЕЛЬ службу для запуска запуска рабочего потока.

package de.vogella.concurrency.threadpools; 

import java.util.concurrent.ExecutorService; 
import java.util.concurrent.Executors; 

public class Main { 
    private static final int NTHREDS = 10; 

    public static void main(String[] args) { 
    //You can also use Executors.newSingleThreadExecutor() if you just need 1 thread 
    ExecutorService executor = Executors.newFixedThreadPool(NTHREDS); 
    for (int i = 0; i < 500; i++) { 
     Runnable worker = new MyRunnable(10000000L + i); 
     executor.execute(worker); 
    } 
    // This will make the executor accept no new threads 
    // and finish all existing threads in the queue. 
    executor.shutdown(); 
    // Wait until all threads are finish 
    //while (!executor.isTerminated()) { 
    //} 
    //System.out.println("Finished all threads"); 
    //All the threads might not be finished at this point of time. Thread endtime purely depends on the time taken by the processing logic inside your thread. 
    } 
} 
+0

Но вы не должны быть заняты в ожидании ... – Axel

+0

Конечно, это всего лишь образец кода, чтобы понять анатомию потока. В реальном коде вы не будете ждать излишне. – zengr

+1

Хорошо, но я боюсь, что пример кода кода часто используется как «потому что он просто работает» ... – Axel

1

Вы имеете в виду что-то вроде этого?

class Parallel { 
    private ExecutorService pool = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()); 

    public void shutdown() { 
     pool.shutdown(); 
    } 

    public void foo() { 
     pool.submit(new Runnable() { 
      @Override 
      public void run() { 
       // put your code here 
      } 
     }); 
    } 
}