То, что вы хотите, может быть достигнуто тремя способами: CSS мудрый:
.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;
}
(это решение имеет очень четкое преимущество встроенного 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;
}
абсолютное позиционирование после вычисления размеров сделанных элементов, через JavaScript (плацдарм кладки).
Если у меня есть поток, слушающий сервер, как я могу передать эти данные в основной поток для интерпретации? Каков наилучший способ для основного потока отправлять данные на сервер?
blockquote>Для этого я использовал бы
BlockingQueue
. Вы определяете одинBlockingQueue
, такой какLinkedBlockingQueue
. Затем ваш класс слушателя вызываетqueue.take()
, который будет ждать, пока ваш сервер вызоветqueue.put()
. Он оставляет все синхронизацию, ждет, уведомляет и т. Д. Для класса Java вместо вашего собственного кода.Что такое синхронизированный модификатор?
blockquote>Я бы кое-что прочитал, чтобы больше узнать об этом. Это не та вещь, на которую можно ответить в коротком ИСО-ответе. Учебник Java concurrency - это хорошее место для начала.
Если вы хотите синхронную связь между основным потоком и потоком обработки, вы можете использовать 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 и т. Д.
Пройдите некоторые учебные пособия для понимания тем Java.
http://www.journaldev.com/1079/java-thread-tutorial
Ваша проблема кажется моделью производителя-потребителя, вы можете использовать BlockingQueue для достижения этой задачи легко.