Cóż, minęło prawie 9 lat, odkąd pierwotnie to opublikowałem i szczerze mówiąc, od tego czasu Java wprowadziła kilka ulepszeń. Zostawię moją pierwotną odpowiedź poniżej, ale ludzie nie muszą robić tego, co w niej jest. 9 lat temu, podczas przeglądu kodu, zapytałbym, dlaczego to zrobili i może to zaakceptowali, a może nie. Przy dostępnych nowoczesnych lambdach nieodpowiedzialne jest posiadanie tak wysoko ocenianej odpowiedzi zalecającej przestarzałe podejście (które, szczerze mówiąc, było wątpliwe na początku ...) We współczesnej Javie ten przegląd kodu zostałby natychmiast odrzucony, a to byłoby zasugerował:
void foo(final String str) {
Thread t = new Thread(() -> someFunc(str));
t.start();
}
Tak jak poprzednio, szczegóły, takie jak obsługa tego wątku w znaczący sposób, pozostawia się czytelnikowi jako ćwiczenie. Ale mówiąc wprost, jeśli boisz się używania lambd, jeszcze bardziej powinieneś bać się systemów wielowątkowych.
Oryginalna odpowiedź, tylko dlatego, że:
Możesz zadeklarować klasę bezpośrednio w metodzie
void Foo(String str) {
class OneShotTask implements Runnable {
String str;
OneShotTask(String s) { str = s; }
public void run() {
someFunc(str);
}
}
Thread t = new Thread(new OneShotTask(str));
t.start();
}
Consumer<T>
.