Обычно вы делаете это примерно так:
public class Foo implements Runnable {
private volatile int value;
@Override
public void run() {
value = 2;
}
public int getValue() {
return value;
}
}
Затем вы можете создать поток и получить значение (учитывая, что значение было установлено)
Foo foo = new Foo();
new Thread(foo).start();
// ... join through some method
int value = foo.getValue();
tl;dr
нить не может вернуть значение (по крайней мере, без механизма обратного вызова). Вы должны ссылаться на поток как обычный класс и запрашивать значение.