2012-12-17 17 views
6
Thread t = new Thread(new Runnable() { public void run() {} }); 

Chciałbym utworzyć wątek w ten sposób. Jak mogę w ogóle przekazać parametry do metody run?Przekazywanie parametru do wątku Java

Edit: Aby mój problem specyficzny, należy rozważyć następujące segment kodu:

for (int i=0; i< threads.length; i++) { 
    threads[i] = new Thread(new Runnable() {public void run() {//Can I use the value of i in the method?}}); 
} 

podstawie odpowiedzi Jona nie będzie działać, ponieważ i nie zostało zgłoszone jako final.

+2

jeśli to możliwe byłoby łatwiejsze, jeśli napisać nową klasę, która implementuje Runnable i przekazuje do niego wszystkie potrzebne parametry w konstruktorze. – giocarmine

+0

W systemie IntelliJ ma do tego funkcję autokorekty. Przypisuje zmienne używane w klasach anonimowych do zmiennych końcowych. –

+0

Proponuję użyć programu THRAEDLOCAL, jego lepszego sposobu na zachowanie i przekazywanie zmiennych do wątków, spróbuj, może się skończyć lepiej –

Odpowiedz

10

Nie, metoda run nigdy nie ma żadnych parametrów. Musisz ustawić stan początkowy na Runnable. Jeśli używasz anonimową klasę wewnętrzną, można to zrobić za pomocą końcowego zmiennej lokalnej:

final int foo = 10; // Or whatever 

Thread t = new Thread(new Runnable() { 
    public void run() { 
     System.out.println(foo); // Prints 10 
    } 
}); 

jeśli piszesz o nazwie klasy, dodać pole do klasy i wypełnić go w konstruktorze.

Alternatywnie, możesz znaleźć klasy w java.util.concurrent, aby pomóc ci więcej (ExecutorService itp.) - to zależy od tego, co próbujesz zrobić.

EDIT: Aby umieścić wyżej w swoim kontekście, wystarczy zmienną końcową w pętli:

for (int i=0; i< threads.length; i++) { 
    final int foo = i; 
    threads[i] = new Thread(new Runnable() { 
     public void run() { 
      // Use foo here 
     } 
    }); 
} 
+0

Po prostu podałem kontekst odnośnie tego, co próbuję zrobić. –

+0

@TerryLi: Zobacz moją edycję, aby dowiedzieć się, jak wykorzystać moje pierwsze podejście w pętli. Lub po prostu użyj nazwanej klasy ... –

5

Można utworzyć obiekt niestandardowy wątek, który akceptuje swoją parametru, na przykład:

public class IndexedThread implements Runnable { 
    private final int index; 

    public IndexedThread(int index) { 
     this.index = index; 
    } 

    public void run() { 
     // ... 
    } 
} 

które mogłyby zostać wykorzystane tak:

IndexedThread threads[] = new IndexedThread[N]; 

for (int i=0; i<threads.length; i++) { 
    threads[i] = new IndexedThread(i); 
} 
Powiązane problemy