2013-02-17 7 views
8
konvertieren

Verzeihen Sie mir, wenn die Frage albern klingt - ich fange gerade an, Executor zu verwenden.Executor-Dienst in Java -> wie man Einzel-Thread-Code zu Executor

Ich habe eine vorhandene Java-Anwendung, die Threads in dieser verwendet manner-- grundsätzlich eigenständige Threads 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; 
    } 

Wie man es von oben sehen kann, gibt die Funktion einen neuen Thread.

nun in der main() Funktion des Programms, ein neuer Thread wird in dieser manner--

erstellt
taskThread = spawnThread(); 

    taskThread.start(); 

Was ich tun möchte, ist, einen Testamentsvollstrecker Service (feste Anzahl von Threads) erstellen -> und dann die Erstellung eines neuen Threads/Ausführung der Aufgabe durch den neuen Thread an diesen Executor übergeben.

Da ich zu Executor sehr neu bin, möchte ich wissen, wie ich den obigen Code ändere, so dass anstelle eines neuen separaten Threads stattdessen ein neuer Thread innerhalb des Thread-Pools erstellt wird. Ich kann keinen Befehl sehen, um einen Thread zu erstellen (innerhalb des Thread-Pools) -> übergebe die obige Aufgabe an diesen Thread (und nicht an einen Stand-alone-Thread wie oben).

Bitte lassen Sie mich wissen, wie Sie dieses Problem lösen können.

+0

Wickeln Sie den Abschnitt "Ausführen" Ihres Threads in eine ausführbare Schnittstelle. Erstellen Sie einen Executor und bieten Sie ihm das Runnable an. Werfen Sie einen Blick auf die [Executor] (http://docs.oracle.com/javase/tutorial/essential/concurrency/executors.html) Spur für weitere Informationen – MadProgrammer

Antwort

8

In Ihrem Haupt, können Sie so etwas schreiben:

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

Die einreichen Methode wird die Runnable auf einer der Threads innerhalb des Testamentsvollstreckers Dienst auszuführen.

Hinweis: Vergessen Sie nicht, den Executor-Dienst herunterzufahren, wenn Sie ihn nicht mehr benötigen oder das Programm nicht mehr beendet werden kann.

5

Machen Sie Ihre Recherche, bevor Sie fragen. Die Idee besteht darin, eine Klasse zu erstellen, die Runnable implementiert und sie mit dem Executor-Service ausführt.

Beispiel aus: Java Concurrency (Multithreading) - Tutorial

Implementation des Arbeiters (die Runnable implementiert):

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

Wie Exekutor-Dienst verwenden laufen der Arbeiter-Thread auslösen.

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

Aber Sie sollten nicht beschäftigt sein warten ... – Axel

+0

Sicher, Dies ist nur ein Beispielcode, um die Anatomie eines Threads zu verstehen. Im echten Code werden Sie nicht unnötig warten. – zengr

+1

Ok, aber ich befürchte, dass SO Beispielcode oft verwendet wird, wie es ist, "weil es einfach funktioniert" ... – Axel

1

Sie meinen etwas wie das?

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