2013-02-17 13 views
8

Przepraszam, jeśli pytanie brzmi głupio - właśnie zaczynam używać Executora.Usługa executora w java -> jak przekonwertować kod pojedynczego wątku, aby użyć executora

Mam istniejącej aplikacji java, który używa wątków w tym manner-- zasadzie samodzielnych wątków 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; 
    } 

Jak widać z powyższego, funkcja zwraca nowy wątek.

Teraz w głównej() funkcji programu, nowy wątek zostanie utworzony w tym manner--

taskThread = spawnThread(); 

    taskThread.start(); 

co chcę zrobić, to stworzyć usługę executora (z numerem stałym wątków) -> a następnie przekazuje tworzenie nowego wątku/wykonanie zadania przez nowy wątek do tego executora.

Ponieważ jestem bardzo nowy w Executorze, chciałbym wiedzieć, jak zmienić powyższy kod, aby zamiast tworzyć nowy osobny wątek zamiast tego tworzony był nowy wątek w puli wątków. Nie widzę żadnego polecenia utworzenia wątku (w puli wątków) -> proszę przekazać powyższe zadanie do tego wątku (a nie do wątku autonomicznego, jak wyżej).

Proszę dać mi znać, jak rozwiązać ten problem.

+0

Owiń sekcję "Uruchom" swojego wątku w interfejsie, które można uruchomić. Utwórz executor i zaoferuj mu Runnable. Przejrzyj ścieżkę [Executor] (http://docs.oracle.com/javase/tutorial/essential/concurrency/executors.html), aby uzyskać więcej informacji. – MadProgrammer

Odpowiedz

8

W głównym, można napisać coś takiego:

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

Sposób przedstawienia wykona Runnable na jednym z wątków w służbie executora.

Uwaga: Nie zapomnij zamknąć usługi executora, gdy już jej nie potrzebujesz lub zapobiegnie to wyjściu programu.

5

Wykonaj swoje badania, zanim zapytasz. Chodzi o to, aby utworzyć klasę, która implementuje Runnable i wykonuje ją za pomocą usługi executora.

przykład z: Java Concurrency (Multithreading) - Tutorial

Wykonanie pracownika (który realizuje 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); 
    } 
} 

Jak skorzystać z usługi executora uruchomić wywołanie procesu roboczego.

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

Ale nie powinieneś być zajęty czekaniem ... – Axel

+0

Oczywiście, to tylko przykładowy kod do zrozumienia anatomii nici. W prawdziwym kodzie nie będziesz czekać niepotrzebnie. – zengr

+1

OK, ale obawiam się, że przykładowy kod będzie często używany tak, jak jest "ponieważ to po prostu działa" ... – Axel

1

Masz na myśli coś takiego?

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