Я использовал его для создания объектов на основе памяти, содержащей сообщения, полученные от сети.
Пробелы должны быть в начале полей ТОЛЬКО там, где они являются частью данных. Excel не удаляет начальные пробелы. Вы получите нежелательные пробелы в заголовках и полях данных. Хуже того, "
, который должен« защищать »этот разрыв строки в третьем столбце, будет проигнорирован, потому что он находится не в начале поля.
Если у вас есть символы, отличные от ASCII (закодированные в UTF-8) в файле у вас должна быть спецификация UTF-8 (3 байта, шестнадцатеричный EF BB BF
) в начале файла. В противном случае Excel будет интерпретировать данные в соответствии с кодировкой по умолчанию для вашего языкового стандарта (например, cp1252) вместо utf-8, и ваши символы, отличные от ASCII, будут удалены.
Следующие ниже комментарии относятся к Excel 2003, 2007 и 2013; не тестировалось в Excel 2000
Если вы открываете файл двойным щелчком по его имени в проводнике Windows, все работает нормально.
Если вы открываете его из Excel, результаты могут отличаться:
Возможные варианты: Отсутствие необходимости ни в сохранении, ни в восстановлении состояния стека ускоряет запуск потока.
Существуют различные причины производительности, по которым вам может понадобиться то или иное. Как вы знаете, слишком много потоков в Java - не лучшая идея. С другой стороны, поскольку вы должны присоединить актера к потоку, прежде чем он сможет реагировать
, получить
сообщение быстрее, чем отреагировать
на него. Так что, если у вас есть акторы, которые получают много сообщений, но очень мало с ними работают, дополнительная задержка response
может сделать его слишком медленным для ваших целей.
реагировать
, то получить
сообщение быстрее, чем отреагировать
на него. Так что, если у вас есть акторы, которые получают много сообщений, но очень мало с ними работают, дополнительная задержка response
может сделать его слишком медленным для ваших целей. поскольку вам нужно присоединить актера к потоку, прежде чем он сможет реагировать
, то получить
сообщение быстрее, чем отреагировать
на него. Поэтому, если у вас есть акторы, которые получают много сообщений, но очень мало с ними делают, дополнительная задержка response
может сделать его слишком медленным для ваших целей. Ответ - «да» - если ваши акторы не блокируют что-либо в вашем коде, и вы используете response
, тогда вы можете запустить свой «одновременно « программа в одном потоке (попробуйте установить системное свойство ctors.maxPoolSize
, чтобы узнать).
Одна из наиболее очевидных причин, по которым необходимо отказаться от стека вызовов заключается в том, что в противном случае метод loop
завершился бы ошибкой StackOverflowError
. Как бы то ни было, фреймворк довольно ловко завершает реакцию
, вызывая исключение SuspendActorException
, которое перехватывается циклическим кодом, который затем снова запускает реакцию
через , а затем
метод.
Эти утверждения о «отбрасывании стека» также сбили меня с толку на некоторое время, и я думаю, что понял это сейчас, и теперь это мое понимание. В случае «приема» в сообщении происходит блокировка выделенного потока (с помощью object.wait () на мониторе), и это означает, что полный стек потоков доступен и готов к продолжению с момента «ожидания» при получении сообщение. Например, если у вас есть следующий код
def a = 10;
while (! done) {
receive {
case msg => println("MESSAGE RECEIVED: " + msg)
}
println("after receive and printing a " + a)
}
, поток будет ждать в вызове приема, пока сообщение не будет получено, а затем продолжит работу и напечатает сообщение «после получения и печать 10» со значением «10», которое находится в кадре стека до того, как поток заблокирован.
В случае реакции такого выделенного потока нет, все тело метода реакции захватывается как закрытие и выполняется некоторым произвольным потоком на соответствующем акторе, получающем сообщение. Это означает, что будут выполняться только те операторы, которые могут быть записаны как замыкание, и именно здесь в игру вступает возвращаемый тип «Nothing». Рассмотрим следующий код
def a = 10;
while (! done) {
react {
case msg => println("MESSAGE RECEIVED: " + msg)
}
println("after react and printing a " + a)
}
. Если бы response имел тип возвращаемого значения void, это означало бы, что допустимо иметь операторы после вызова «react» (в этом примере оператор println, который печатает сообщение «после реакции и выводит 10 "), но на самом деле это никогда не будет выполнено, поскольку только тело метода" реагировать "захватывается и упорядочивается для выполнения позже (по прибытии сообщения). Так как контракт response имеет тип возвращаемого значения «Nothing», не может быть никаких операторов после реакции, и поэтому нет причин для поддержания стека.В приведенном выше примере переменную «a» не нужно поддерживать, поскольку операторы после вызовов реакции не выполняются вообще. Обратите внимание, что все необходимые переменные в теле реакции уже зафиксированы как замыкание, поэтому он может выполняться нормально.
Среда java-акторов Килим фактически обслуживает стек, сохраняя стек, который разворачивается при получении сообщения в ответ.
Просто чтобы было здесь:
Event-Based Programming without Inversion of Control
Эти статьи связаны с scala api для Actor и обеспечивают теоретическую основу для реализации actor. В том числе о том, почему react может никогда не вернуться.