Плагин информации о доступе к потоку визуализирует информацию о доступе для чтения/записи и потоке в отладчике.
Как правило, связанные с кодом структуры данных в платформе IntelliJ защищены одной блокировкой чтения/записи.
Вы не должны обращаться к модели вне действия чтения или записи для следующих подсистем:
Интерфейс структуры программы (PSI)
Виртуальная файловая система (VFS)
Корневая модель проекта.
Чтение данных разрешено из любого потока. Чтение данных из UI-потока не требует особых усилий. Однако операции чтения, выполняемые из любого другого потока, должны быть заключены в действие чтения (RA). Не гарантируется сохранение соответствующих объектов между несколькими последовательными действиями чтения. Как правило, всякий раз, когда вы начинаете чтение, проверяйте, действителен ли PSI/VFS/проект/модуль.
API: ApplicationManager.getApplication().runReadAction()
или ReadAction
run()
/ Compute()
Запись данных разрешена только из потока пользовательского интерфейса, операции записи всегда необходимо обернуть в действие записи (WA). Изменение модели разрешено только из защищенных от записи контекстов, включая действия пользователя и вызовы SwingUtilities.invokeLater()
из них (см. следующий раздел). Вы не можете изменять PSI, VFS или модель проекта из средств визуализации пользовательского интерфейса или SwingUtilities.invokeLater()
вызовов.
API: ApplicationManager.getApplication().runWriteAction()
или WriteAction
run()
/ Compute()
Для передачи управления из фонового потока в Event Thread (EDT), вместо стандартного SwingUtilities. invokeLater()
плагины должны использовать ApplicationManager.getApplication().invokeLater()
. Последний API позволяет указать состояние модальности ( ModalityState
) для звонка, т. е. стек модальных диалогов, в которых разрешено выполнение звонка:
Операция будет выполнена после закрытия всех модальных диалогов. Если какой-либо из открытых (несвязанных) проектов отображает модальное диалоговое окно для каждого проекта, действие будет выполнено после закрытия диалогового окна.
Операция может быть выполнена, когда самый верхний показанный диалог содержит указанный компонент или является одним из его родительских диалогов.
ModalityState.defaultModalityState()
. Это оптимальный выбор в большинстве случаев, когда используется текущее состояние модальности при вызове из потока пользовательского интерфейса. Он имеет специальную обработку для фоновых процессов, запущенных с помощью ProgressManager
: invokeLater()
из такого процесса, который может запускаться в том же диалоговом окне, в котором запущен процесс.
Операция будет выполнена как можно скорее, независимо от модальных диалогов. Обратите внимание, что изменение PSI, VFS или модели проекта запрещено для таких исполняемых модулей.
Если действию потока пользовательского интерфейса требуется доступ к файловому индексу (например, он выполняет анализ PSI в масштабе всего проекта, разрешает ссылки и т. д.), используйте DumbService.smartInvokeLater()
. Таким образом, он запускается после завершения всех возможных процессов индексации.
Фоновые процессы управляются классом ProgressManager
, который имеет множество методов для выполнения заданного кода с модальным (диалоговым), немодальным (видимым в строке состояния) или невидимым ходом. Во всех случаях код выполняется в фоновом потоке, связанном с Объект ProgressIndicator
. Индикатор текущего потока можно получить в любое время с помощью ProgressIndicatorProvider.getGlobalProgressIndicator()
.
Для видимого прогресса потоки могут использовать ProgressIndicator
для уведомления пользователя о текущем состоянии: например, установить текстовую или визуальную часть выполненной работы.
Индикаторы выполнения также предоставляют средства для обработки отмены фоновых процессов либо пользователем (нажатием кнопки «Отмена»), либо кодом (например, когда текущая операция устаревает из-за некоторых изменений в проекте). Прогресс можно отметить как отмененный, позвонив по номеру 9.0029 ProgressIndicator.cancel() . Процесс реагирует на это, вызывая ProgressIndicator.checkCanceled()
(или ProgressManager.checkCanceled()
, если под рукой нет экземпляра индикатора). Этот вызов создает специальное непроверенное исключение ProcessCanceledException
, если фоновый процесс был отменен.
Весь код, работающий с PSI или другими типами фоновых процессов, должен быть подготовлен к возникновению ProcessCanceledException
из любой точки. Это исключение никогда не должно регистрироваться в журнале, а должно создаваться повторно, и оно будет обрабатываться в той инфраструктуре, которая запустила процесс.
checkCanceled()
следует вызывать достаточно часто, чтобы гарантировать плавную отмену процесса. Внутренности PSI содержат множество вызовов checkCanceled()
внутри. Если процесс выполняет длительную не-PSI-активность, вставьте явные вызовы checkCanceled()
, чтобы это происходило часто, например, на каждой N-й итерации цикла.
Генерация ProcessCanceledException
из checkCanceled()
можно отключить для разработки (например, при отладке кода) с помощью инструментов | Внутренние действия | Отключить действие ProcessCanceledException. Действие доступно, только если включен внутренний режим.
Фоновые потоки не должны выполнять обычные действия чтения в течение длительного времени. Причина в том, что если потоку пользовательского интерфейса требуется действие записи (например, пользователь что-то вводит), оно должно быть получено как можно скорее. В противном случае пользовательский интерфейс зависнет до тех пор, пока все фоновые потоки не выполнят свои действия чтения.
Самый известный подход — отменять действия фонового чтения всякий раз, когда должно произойти действие записи, и перезапускать это действие фонового чтения позже с нуля. Подсветка редактора, завершение кода, действия Goto Class/File/… работают так.
Для этого запускается длительная фоновая операция с индикатором ProgressIndicator
, а специальный слушатель отменяет этот индикатор, когда инициируется действие записи. В следующий раз, когда фоновый поток вызовет checkCanceled()
, будет выброшено ProcessCanceledException
, и поток должен остановить свою работу (и завершить действие чтения) как можно скорее.
Есть два рекомендуемых способа сделать это:
Если в потоке пользовательского интерфейса, вызовите ReadAction.nonBlocking()
, который возвращает NonBlockingReadAction
(NBRA)
Если уже в фоновом потоке, используйте ProgressManager.getInstance().runInReadActionWithWriteActionPriority()
в цикле, пока не пройдет или вся активность устаревший.
В обоих подходах всегда проверяйте в начале каждого действия чтения, действительны ли объекты, и имеет ли смысл вся операция (т. е. не отменена пользователем, проект не закрыт и т. д. ). С ReadAction.nonBlocking()
, для этого используйте expireWith()
или expireWhen()
.
Если действие должно получить доступ к файловому индексу (например, оно выполняет анализ PSI в масштабе всего проекта, разрешает ссылки и т. д.), используйте ReadAction.nonBlocking(...).inSmartMode()
.
В частности, не просматривайте виртуальную файловую систему, анализируйте PSI, разрешайте ссылки или запрашивайте индексы/заглушки.
Есть еще несколько случаев, когда платформа сама вызывает такой дорогостоящий код (например, разрешить в AnAction.update()
), но над ними ведется работа. Тем временем, пожалуйста, постарайтесь ускорить то, что вы можете в своем плагине, так как это будет в целом полезно, а также улучшит производительность подсветки фона. Для реализации AnAction
авторам плагинов следует специально просмотреть документацию AnAction.getActionUpdateThread()
в разделе «Действия», поскольку в ней описывается, как работает многопоточность для действий.
WriteAction
в настоящее время должны выполняться в потоке пользовательского интерфейса, поэтому, чтобы ускорить их, вы можете попытаться перенести как можно больше из действия записи в этап подготовки, который затем можно будет вызвать в фоновом режиме (например, с помощью ReadAction. nonBlocking()
, см. выше).
Не делайте ничего дорогостоящего внутри прослушивателей событий. В идеале вы должны очистить только некоторые кеши. Вы также можете запланировать фоновую обработку событий, но будьте готовы к тому, что некоторые новые события могут быть доставлены до того, как начнется фоновая обработка, и, таким образом, мир может измениться к этому моменту или даже в середине фоновой обработки. Рассмотрите возможность использования MergingUpdateQueue
и ReadAction.nonBlocking()
для устранения этих проблем.
Массовые пакеты событий VFS могут быть предварительно обработаны в фоновом режиме, см. AsyncFileListener
(2019.2 или более поздняя версия).
Последнее изменение: 06 декабря 2022 г.
Disposer и одноразовая инфраструктура обмена сообщениями
Почти на каждом мероприятии, которое я посещаю, проводится сессия по аналитике eDiscovery. И не зря — когда вы сталкиваетесь с базой данных, содержащей от нескольких тысяч до миллионов документов, вам нужны способы выяснить, что там, не просматривая каждый отдельный документ. Посмотрим правде в глаза, это почти каждый случай в наши дни. Я не говорю о больших, я говорю о каждом. одинокий. случай. Один PST-файл или жесткий диск могут содержать тысячи документов. Объем данных, создаваемых пользователями, может означать, что у вас есть значительная база данных даже при очень целенаправленных усилиях по сбору.
Аналитика — это все способы помочь вам взглянуть на отношения между данными, терминами или концепциями, которые вы выбираете, которые сужают набор данных до чего-то управляемого. Они бывают разных форм и имеют множество стоимостей, и мы начнем рассматривать различные формы в следующих статьях. Одним из лучших инструментов аналитики является цепочка писем. Если вы не используете его, вы захотите начать. И что самое приятное в электронной почте? Это бесплатно.
Что такое ветки электронной почты? Цепочка сообщений электронной почты объединяет строку связанных сообщений электронной почты в цепочку. Например, если я отправлю сообщение с просьбой о пунктах повестки дня четырем людям, и все четверо ответят индивидуально, все эти сообщения создадут цепочку писем или цепочку. Тема включает в себя исходное электронное письмо и все ответы и даже переадресованные электронные письма.
Одна из самых больших проблем при просмотре данных заключается в том, что когда вы входите в базу данных, это просто одна большая куча документов. И это до смерти пугает большинство юристов и не пускает их. Но такие инструменты, как потоки электронной почты, помогают вам разобраться в этом болоте, когда вы просматриваете данные и видите, как хранители общаются, с кем и о чем. Как я люблю говорить, если вы предоставляете проверку данных не юристам, вы не выполняете свою работу по знанию фактов и созданию эффективной стратегии.
Итак, как вы можете использовать потоки электронной почты? Позвольте мне считать пути. Вот несколько, чтобы вы начали. Как всегда, я призываю вас подумать о том, что вы ищете, и как вы можете использовать потоки электронной почты, чтобы сосредоточиться на этом или избавиться от шума в вашей коллекции.
Тесса Джейкоб, возглавляющая группу решений для обнаружения электронных данных Husch Blackwell, говорит, что ей удалось сократить на 50 % количество электронных писем, которые необходимо просмотреть с помощью потоков электронной почты. Тесса также поделилась своими лучшими техническими советами по использованию потоков электронной почты:
Будьте осторожны при использовании ограничений даты в сочетании с многопоточностью. Ограничения по дате, применяемые после или в сочетании с потоковой передачей, могут привести к тому, что вы пропустите электронные письма. Система идентифицирует инклюзивные электронные письма по содержанию. Поиск полей метаданных электронной почты по определенной дате или «на или до определенной даты» может вызвать уникальные проблемы, поскольку вы не можете найти их во включающем наборе электронной почты, поскольку они были подавлены потоками.
Не забывайте просматривать «автономные» электронные письма — те электронные письма, которые не имеют тредов в вашем наборе данных. Они, как правило, не будут идентифицированы в вашем включающем поле электронной почты как «Да» или «Нет», и их легко пропустить.
Включите поле Статус проверки в обязательные поля кодирования и отметьте неинклюзивные семьи как непроверенные. Это идентифицирует документы, которые вы намеренно не просматривали, а не только те, которые были случайно пропущены.
В настоящее время большинство инструментов проверки включают в себя потоковую передачу электронной почты как часть своего основного предложения, но вы хотите проверить, и если у вас ее нет, перейдите к инструменту, который это делает. Мы используем потоки электронной почты в сочетании с другой аналитикой и отдельно в зависимости от случая. И в то время как многие говорящие головы считают, что неверная электронная почта осталась в прошлом, мы все еще видим ее в изобилии и думаем, что так будет еще долгие годы. При этом я уверен, что по мере того, как другие формы общения выходят в центр внимания (например, обмен мгновенными сообщениями), инструменты потоков будут столь же ценными — вопрос в том, позволят ли эти формы общения использовать их.
Как вы используете потоки электронной почты? Можете поделиться хорошими историями об успешном поиске этих ключевых документов с помощью потоков электронной почты? Напишите мне и дайте мне знать.
Келли Твиггер отказалась от золотых наручников своего партнерства Biglaw, чтобы основать ESI Attorneys, юридическую фирму по раскрытию электронных данных и информации, в 2009 году. Она увлечена обучением юристов и юристов тому, как думать и использовать ESI для победы, и делает это регулярно для своих клиентов. Коллегия адвокатов штата Висконсин назвала Келли новатором в области права в 2014 году за ее разработку помощника по обнаружению электронных данных — интерактивного пособия по исследованию и обнаружению электронных данных для юристов и юристов.
Об авторе