2016-08-09 11 views
6

[Sprawdź dno pytanie o aktualizacjach]Java - Pass metodę do klasy i wykonać go w nowy wątek

Jak w tytule, chciałbym napisać klasę która przyjmuje w metoda i wykonuje ją w nowym wątku. I czai się wokół SO i wymyślił coś takiego:

import java.util.concurrent.Callable; 

public class MyExecutor<T> implements Runnable{ 

    private Callable<T> method; 


    public <T> MyExecutor(Callable<T> pMethod){ 
     this.method = pMethod; 
    } 

    @Override 
    public void run() { 
     try { 
      // start a new Thread, then 
      method.call(); 
     } catch (Exception e) { 
      System.err.println("Failed calling method "+method.getClass()); 
      e.printStackTrace(); 
     } 

    } 

} 

Jednak Eclipse ostrzega mnie, że wewnątrz konstruktora, w

this.method = pMethod; 

I cannot convert from Callable <T> to Callable <T>.

Pachnie tak, jak robię coś zupełnie nie tak, ale nie mogę tego uchwycić.

UPDATE

Okazuje się, że byłem wyważania otwartych drzwi, co chciałem zrobić, może zostać osiągnięty tak:

public class MyExecutor implements Executor{ 


    @Override 
    public void execute(Runnable command) { 
     new Thread(command).start(); 
    } 

} 

W głównym strumieniu sposób może być wykonywany w nowym wątku tak:

MyExecutor myExec = new MyExecutor(); 

    myExec.execute(new Runnable() { 

     @Override 
     public void run() { 
      myMethod(); 
     } 
    }); 
+0

nie można przekazywać metod do innych klas. można przekazywać instancje metod, na których można wywoływać metody – Stultuske

+2

Czy próbowałeś usunąć przed konstruktorem? – dasblinkenlight

+3

'' 'zanim twój konstruktor deklaruje drugi typ ogólny, zwany także' T'. Jeśli ją usuniesz, kod powinien być w porządku. – khelwood

Odpowiedz

6

Ponieważ dodany parametr typu <T> do konstruktora, to cienie typ pa rameter dla klasy. Dlatego parametr T dla argumentu konstruktora pMethod jest inny niż parametr klasy, o którym ostrzega Eclipse. Po prostu zmień podpis konstruktora na public MyExecutor(...).

+0

Dziękuję, masz rację. Skoro już tu jesteśmy, czy pomysł (przekazanie metody klasie, stworzenie wątku w mojej klasie generycznej i wykonanie mojej metody) ma sens? Czy to przyzwoita praktyka? Oznaczone jako rozwiązanie w każdym razie. – Tom

+5

@ Tom Wyobraź sobie, że odkrywasz nowe koło. JDK ma już executory, które zapewniają ci funkcjonalność (i więcej, z 'Future' i innymi podobnymi rzeczami). Przynajmniej wiesz, że twój pomysł jest wystarczająco ważny, aby uwzględnić go w środowisku wykonawczym;) – Kayaman

+0

Jak mówi Kayaman - nie tylko jest to ważna praktyka, to już jest zrobione. Możesz zajrzeć do hierarchii 'java.util.concurrent.Executor'. –

Powiązane problemy