Если вы хотите синхронную связь между основным потоком и потоком обработки, вы можете использовать SynchronousQueue .
Идея состоит в том, что основной поток передает данные в поток обработки вызвав put()
, и поток обработки вызывает take()
. Обе операции блокировки.
Обратите внимание, что если вы хотите отправить результат, тогда ситуация может немного усложниться, поскольку основной поток должен знать, когда результат будет готов. A CountDownLatch - хороший примитив для этого. Вы можете сделать что-то вроде этого.
Сначала давайте определим datastructure для передачи данных вокруг:
public class MethodCall {
public final String methodName;
public final Object[] args;
public final CountDownLatch resultReady;
public Object result;
public MethodCall(String methodName, Object[] args) {
this.methodName = methodName;
this.args = args;
this.resultReady = new CountDownLatch(1);
}
public void setResult(Object result) {
this.result = result;
resultReady.countDown();
}
public Object getResult() throws InterruptedException {
resultReady.await();
return result;
}
}
Определите очередь для передачи данных вокруг, видимых обоими потоками:
public SynchronousQueue methodCalls = new SynchronousQueue();
Чтобы сделать вызов из основного потока в поток обработки и дождаться результата:
MethodCall call = new MethodCall(methodName, args);
methodCalls.put(call);
Object result = call.getResult();
В потоке обработки, например, в методе run()
, вы может тогда сделать:
for (;;) {
MethodCall call = methodCalls.take();
Object res = processStuff(call.methodName, call.args);
call.setResult(res);
}
Где processStuff
реализует вашу логику. Конечно, вы также должны иметь дело с исключениями, заниматься случаями выхода, изменять MethodCall
, чтобы иметь более конкретные вещи, чем methodName
и args
и Object
return и т. Д.
Вы должны использовать компонент LInk, а не a, если вы хотите, чтобы браузер-маршрутизатор управлял вашей навигацией, как показано здесь.
https://reacttraining.com/react-router/web/api/Link/to-string
<Link
to={{
pathname: "/courses",
search: "?sort=name",
hash: "#the-hash",
state: { fromDashboard: true }
}}
/>