Ну, пройшло майже 9 років, як я спочатку опублікував це і, якщо чесно, Java з тих пір зробила пару вдосконалень. Я залишу свою оригінальну відповідь нижче, але людям не потрібно робити те, що в ній. 9 років тому під час перегляду коду я б запитав, чому вони це зробили, і, можливо, це затвердили, а може, і ні. За наявних сучасних лямбдаз безвідповідально мати таку високоголосну відповідь, що рекомендує антикваріатний підхід (який, справедливо кажучи, був сумнівним для початку ...) У сучасній Яві цей огляд коду буде негайно відхилено, і це було б запропонував:
void foo(final String str) {
Thread t = new Thread(() -> someFunc(str));
t.start();
}
Як і раніше, деталі, як-от змістовне поводження з цією ниткою, залишаються читачем як вправа. Але якщо говорити прямо, якщо ви боїтеся використовувати лямбда, ви повинні ще більше боятися багатопотокових систем.
Оригінальна відповідь, просто тому, що:
Ви можете оголосити клас прямо в методі
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>
.