Как передать объект от основного потока до другого потока в Java

В первую очередь, необходимо ли использовать их для текстовой индексации поиска? GIN и GiST являются индексом, специализированным для некоторых типов данных. Если необходимо индексировать простые символьные или целочисленные значения тогда, нормальный индекс B-дерева является лучшим.
Так или иначе, документация PostgreSQL имеет главу по СУТЬ и один на GIN, где можно найти больше информации
И, наконец, что не менее важно, лучший способ найти, который является лучшим, должен генерировать демонстрационные данные (так же, поскольку необходимо быть реальным сценарием), и затем создайте индекс СУТИ, имея размеры, сколько времени необходимо, чтобы создать индекс, вставить новое значение, выполните демонстрационный запрос. Тогда отбросьте индекс и сделайте то же с индексом GIN. Сравните значения, и у Вас будет ответ, в котором Вы нуждаетесь, на основе Ваших данных.

5
задан Surjya Narayana Padhi 25 November 2009 в 03:45
поделиться

4 ответа

Совместное использование объектов между потоками может стать очень запутанным, вы можете прочитать о модели актера для другого подхода. В частности, в области графического интерфейса пользователя помогает код подхода Модель-Представление-Контроллер .

Но, вернемся к вопросу, вы можете быстро взломать его, сделав JTextArea статической переменной и просто позволив всем различным потоки изменяют статический экземпляр по желанию:

public static JTextArea TXTAREA

void main_application(){
    //set up app
    ...
    TXTAREA = new JTextArea()
    ...
}

затем в потоке последовательного чтения задайте текст для TXTAREA . Это решение не идеальное, я думаю, что лучшим подходом было бы использовать подход MVC и иметь контроллер, который принимает значение для ввода в текстовую область.

1
ответ дан 15 December 2019 в 06:28
поделиться

Как упоминалось в другом ответе, вы можете изменять только содержимое компонента Swing на самом потоке Swing. Хороший способ убедиться, что все ваши другие потоки делают это, - не раскрывать фактическую JTextArea, а скорее предоставить другим объектам безопасный метод добавления текста в текстовую область из вашего main_application, например:

public class основное_приложение {

private JTextArea txtArea;

public void addText(final String txt) {
    SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            txtArea.setText(txtArea.getText() + txt);
        }
    });
}

}

Это простой пример, но вы можете расширить его в зависимости от ваших потребностей. При этом также используется более дорогостоящий способ добавления к тексту, так как добавляются две неизменяемые строки. Вы можете использовать JTextArea.getDocument () для получения модели, а затем использовать методы мутации в документе для более эффективного обновления текста. Однако, предоставляя такой метод, вы можете изменить реализацию в будущем, не затрагивая другие ваши потоки или объекты.

Обратите внимание, что параметр txt является окончательным, что необходимо, чтобы на него можно было напрямую ссылаться в анонимном внутреннем классе.

Вы можете отделить его от основного класса приложения и создать интерфейс или класс для методов / способов, которыми вы хотите управлять текстовой областью из других ваших потоков, а затем передайте им объект, которым обертывается эта текстовая область.

2
ответ дан 15 December 2019 в 06:28
поделиться

Взгляните на SynchronousQueue:

http://java.sun.com/javase/6/docs/api/java/util/concurrent/SynchronousQueue.html

It позволит вам сохранить объект в очереди, а затем будет ждать его удаления.

0
ответ дан 15 December 2019 в 06:28
поделиться
  1. Публикация ссылки JTextArea на другой поток некорректна, потому что компоненты Swing основаны на MVC (на самом деле model-ui). Итак, ваш общий способ работы с компонентами Swing - это обновить их модели и позволить view (ui) отображать изменения;
  2. Другой момент заключается в том, что большинство компонентов Swing не являются поточно-ориентированными, т.е. вы не можете быть уверены что ваше приложение работает нормально, если вы используете компонент Swing из потока более чем EDT ;

Итак, вы должны делать следующее: каждый раз, когда у вас есть новые данные для отображения, отправляйте новую задачу JTextArea обновление содержимого, которое должно выполняться из EDT. Вы можете добиться этого с помощью SwingUtilities.invokeLater ()

0
ответ дан 15 December 2019 в 06:28
поделиться
Другие вопросы по тегам:

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