Как мы можем получить доступ к значениям между двумя потоками в java? [Дубликат]

То, что вы хотите, может быть достигнуто тремя способами: CSS мудрый:

1. flexbox:

    .parent {
        display: flex;
        flex-direction: column;
        flex-wrap: wrap;
        max-width: {max-width-of-container} /* normally 100%, in a relative container */
        min-height: {min-height-of-container}; /* i'd use vh here */
    }
    .child {
        width: {column-width};
        display: block;
    }

2. CSS-столбцы

(это решение имеет очень четкое преимущество встроенного column-span - довольно удобно для названий). Недостатком является упорядочивание элементов в столбцах (первый столбец содержит первую треть элементов и т. Д.). Для этого я сделал jsFiddle .

    .parent {
        -webkit-columns: {column width} {number of columns}; /* Chrome, Safari, Opera */
        -moz-columns: {column width} {number of columns}; /* Firefox */
        columns: {column width} {number of columns};
    }
    .child {
         width: {column width};
    }
    /* where {column width} is usually fixed size 
     * and {number of columns} is the maximum number of columns.
     * Additionally, to avoid breaks inside your elements, you want to add:
     */
    .child {
        display: inline-block;
        -webkit-column-break-inside: avoid;
        page-break-inside: avoid;
        break-inside: avoid-column;
    }

3. Масонский плагин

абсолютное позиционирование после вычисления размеров сделанных элементов, через JavaScript (плацдарм кладки).

23
задан Bakies 4 January 2013 в 00:39
поделиться

3 ответа

Если у меня есть поток, слушающий сервер, как я могу передать эти данные в основной поток для интерпретации? Каков наилучший способ для основного потока отправлять данные на сервер?

Для этого я использовал бы BlockingQueue . Вы определяете один BlockingQueue, такой как LinkedBlockingQueue . Затем ваш класс слушателя вызывает queue.take(), который будет ждать, пока ваш сервер вызовет queue.put(). Он оставляет все синхронизацию, ждет, уведомляет и т. Д. Для класса Java вместо вашего собственного кода.

Что такое синхронизированный модификатор?

Я бы кое-что прочитал, чтобы больше узнать об этом. Это не та вещь, на которую можно ответить в коротком ИСО-ответе. Учебник Java concurrency - это хорошее место для начала.

30
ответ дан Gray 20 August 2018 в 19:35
поделиться
  • 1
    Если сервер удален, я должен прослушивать сокет в новом потоке. Затем, когда сообщение получено, добавьте его в очередь. Затем попросите основную программу проверить очередь и решить, как интерпретировать полученное сообщение. Верный? – Bakies 4 January 2013 в 02:10
  • 2
    Что-то вроде этого должно работать. Или вы можете использовать RMI для размещения сообщения в удаленной очереди. Это устраняет необходимость делать код сокета. Смотрите: oracle.com/technetwork/java/javase/tech/index-jsp-136424.html – Gray 4 January 2013 в 15:02

Если вы хотите синхронную связь между основным потоком и потоком обработки, вы можете использовать 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<MethodCall> methodCalls = new SynchronousQueue<MethodCall>();

Чтобы сделать вызов из основного потока в поток обработки и дождаться результата:

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 и т. Д.

6
ответ дан Florent Guillaume 20 August 2018 в 19:35
поделиться

Пройдите некоторые учебные пособия для понимания тем Java.

http://www.journaldev.com/1079/java-thread-tutorial

Ваша проблема кажется моделью производителя-потребителя, вы можете использовать BlockingQueue для достижения этой задачи легко.

Очередь блокировки Java

5
ответ дан Pankaj 20 August 2018 в 19:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: