В первую очередь, необходимо ли использовать их для текстовой индексации поиска? GIN и GiST являются индексом, специализированным для некоторых типов данных. Если необходимо индексировать простые символьные или целочисленные значения тогда, нормальный индекс B-дерева является лучшим.
Так или иначе, документация PostgreSQL имеет главу по СУТЬ и один на GIN, где можно найти больше информации
И, наконец, что не менее важно, лучший способ найти, который является лучшим, должен генерировать демонстрационные данные (так же, поскольку необходимо быть реальным сценарием), и затем создайте индекс СУТИ, имея размеры, сколько времени необходимо, чтобы создать индекс, вставить новое значение, выполните демонстрационный запрос. Тогда отбросьте индекс и сделайте то же с индексом GIN. Сравните значения, и у Вас будет ответ, в котором Вы нуждаетесь, на основе Ваших данных.
Совместное использование объектов между потоками может стать очень запутанным, вы можете прочитать о модели актера для другого подхода. В частности, в области графического интерфейса пользователя помогает код подхода Модель-Представление-Контроллер .
Но, вернемся к вопросу, вы можете быстро взломать его, сделав JTextArea статической переменной и просто позволив всем различным потоки изменяют статический экземпляр по желанию:
public static JTextArea TXTAREA
void main_application(){
//set up app
...
TXTAREA = new JTextArea()
...
}
затем в потоке последовательного чтения задайте текст для TXTAREA
. Это решение не идеальное, я думаю, что лучшим подходом было бы использовать подход MVC и иметь контроллер, который принимает значение для ввода в текстовую область.
Как упоминалось в другом ответе, вы можете изменять только содержимое компонента 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 является окончательным, что необходимо, чтобы на него можно было напрямую ссылаться в анонимном внутреннем классе.
Вы можете отделить его от основного класса приложения и создать интерфейс или класс для методов / способов, которыми вы хотите управлять текстовой областью из других ваших потоков, а затем передайте им объект, которым обертывается эта текстовая область.
Взгляните на SynchronousQueue:
http://java.sun.com/javase/6/docs/api/java/util/concurrent/SynchronousQueue.html
It позволит вам сохранить объект в очереди, а затем будет ждать его удаления.
Итак, вы должны делать следующее: каждый раз, когда у вас есть новые данные для отображения, отправляйте новую задачу JTextArea обновление содержимого, которое должно выполняться из EDT. Вы можете добиться этого с помощью SwingUtilities.invokeLater ()