Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
0 / 0 / 1
Регистрация: 30.09.2013
Сообщений: 15

Как лучше организовать работу и взаимосвязь почти одинаковых потоков?

15.01.2015, 16:19. Показов 1693. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
При запуске программы появляется окно, в которое вводятся параметры, нажимаем Ok, и теперь у нас на основе этих параметров создаются два соединения (код их создания одинаков, только параметры для подключения разные). Но у каждого соединения есть свой набор функционала, поэтому объединить чисто в один тред не представляется возможным. Вопрос заключается в том, каким образом лучше всего организовать потоки и управление между ними, так чтобы это было корректно и красиво?

Ранее создавал экземпляр класса extends Thread с первым соединением, в нем подключался, выполнял действия, устанавливал CountDownLatch, создавал экземпляр дочернего класса также extends Thread , выполнял необходимые действия со вторым соединеним, потом делал CountDown для родительского потока из дочернего, а для дочернего устанавливал CountDownLatch и вот так переключался между ними. Но как-то меня смущает такой алгоритм, кажется некорректным и некрасивым.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
15.01.2015, 16:19
Ответы с готовыми решениями:

Как организовать корректную работу потоков с одним файлом
private void button1_Click(object sender, EventArgs e) { for (int p = 0; p < 2; p++) { ...

Как лучше организовать работу с функциями?
Упростил задачу для примера. В реальности взаимосвязи намного сложнее. Есть два php файла. В каждом из них есть одинаковая функция....

Сервер 1С. Как лучше организовать работу в фирме?
Добрый день! Коротко ситуация: Есть фирма с 20 точками в городе (по одному компьютеру с установленной локальной 1С 7). ...

2
636 / 528 / 165
Регистрация: 01.04.2010
Сообщений: 1,843
15.01.2015, 22:56
Без кода я не совсем понял описанную ситуацию, но есть у меня подозрение, что защёлку ты используешь не в том месте. Как мне кажется в твоей ситуации достаточно фьючера с коллбэком и зациклить создание фьючера.
0
0 / 0 / 1
Регистрация: 30.09.2013
Сообщений: 15
16.02.2015, 18:43  [ТС]
Лучший ответ Сообщение было отмечено Fasterovich как решение

Решение

Обрисовываю ситуацию более подробно. Мне нужен правильный алгоритм организации классов.


Есть самый галвный класс, который запускает UI с кнопками им формами

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
public class ВaseMain {
 
  private static final Logger logger = LoggerFactory.getLogger(RamoseBaseMain.class);
    private JPanel appPanel;
    public JCheckBox getJournalCheckBox;
    public JCheckBox updateConf2CheckBox;
    public JCheckBox changeConfsByCommandCheckBox;
    public JCheckBox updateConfSoftware1CheckBox;
    public JCheckBox resetTerminalCheckBox;
    public JCheckBox updateServerNotExistCheckBox;
    public JCheckBox changeSimCheckBox;
    public JCheckBox updateErrorVerificConf3CheckBox;
    public JCheckBox updateSoftware2CheckBox;
    public JCheckBox updateErrorLoadFilesConf3CheckBox;
    public JCheckBox updateNewVersionNotExistCheckBox;
    public JCheckBox syncTimeCheckbox;
    public JCheckBox checkPriorityOperatorCheckBox;
    public JCheckBox timeGetCheckBox;
    public JCheckBox errorDeleteFileCheckBox;
    public JCheckBox authErrorCheckBox;
    public JTextField simCountextField;
    public JTextField Config1textField;
    public JTextField Config2textField;
    public JTextField Config3textField;
    public JFormattedTextField tppIdtextField;
    public JTextField JarConf1textField;
    public JTextField JarConf2textField;
    public JCheckBox AllCheckBox;
    public JButton startButton;
    public JTextField connectionString1textField;
    public JTextField connectionString2textField;
 
 
 
    private long loginSendTimestamp;
 
    public static void main(String args[]) throws IOException {
        BaseMain baseMain = new BaseMain();
        baseMain.startApp();
    }
 
 
 
 public void startApp() throws IOException {
 
        readPropertyFile();
 
        AllCheckBox.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent event) {
                JCheckBox cb = (JCheckBox) event.getSource();
                if (cb.isSelected()) {
                    updateConfSoftware1CheckBox.setSelected(true);
                    updateConf2CheckBox.setSelected(true);
                    updateSoftware2CheckBox.setSelected(true);
                    updateNewVersionNotExistCheckBox.setSelected(true);
                    updateErrorLoadFilesConf3CheckBox.setSelected(true);
                    updateErrorVerificConf3CheckBox.setSelected(true);
                    updateServerNotExistCheckBox.setSelected(true);
                    resetTerminalCheckBox.setSelected(true);
                    changeConfsByCommandCheckBox.setSelected(true);
                    getJournalCheckBox.setSelected(true);
                    syncTimeCheckbox.setSelected(true);
                    checkPriorityOperatorCheckBox.setSelected(true);
                    timeGetCheckBox.setSelected(true);
                    errorDeleteFileCheckBox.setSelected(true);
                    changeSimCheckBox.setSelected(true);
                    authErrorCheckBox.setSelected(true);
                } else {
                    updateConfSoftware1CheckBox.setSelected(false);
                    updateConf2CheckBox.setSelected(false);
                    updateSoftware2CheckBox.setSelected(false);
                    updateNewVersionNotExistCheckBox.setSelected(false);
                    updateErrorLoadFilesConf3CheckBox.setSelected(false);
                    updateErrorVerificConf3CheckBox.setSelected(false);
                    updateServerNotExistCheckBox.setSelected(false);
                    resetTerminalCheckBox.setSelected(false);
                    changeConfsByCommandCheckBox.setSelected(false);
                    getJournalCheckBox.setSelected(false);
                    syncTimeCheckbox.setSelected(false);
                    checkPriorityOperatorCheckBox.setSelected(false);
                    timeGetCheckBox.setSelected(false);
                    errorDeleteFileCheckBox.setSelected(false);
                    changeSimCheckBox.setSelected(false);
                    authErrorCheckBox.setSelected(false);
                }
            }
        });
 
        startButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                try {
                    writePropertyFile();
 
 
/**/
 
 
 
 
                } catch (IOException e1) {
                    e1.printStackTrace();
                }
            }
        });
 
        JFrame frame = new JFrame("Test Application");
        frame.setContentPane(appPanel);
        frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
 
 
    }
 
}

Далее, необходимо будет поднять два соединения с разными учетными записями с сервером, которые будут отправлять разные текстовые команды:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public boolean init(){
      ConnectionConfiguration connectionConfiguration = new ConnectionConfiguration("", ConnectionType.AS_, connectionStr);
        connection = ConnectionFactory.createConnection(connectionConfiguration);
        connection.setReceiver(this);
        connection.setListener(this);
 
        AccountInfo account = new AccountInfo();
        account.setConnectionString(connectionString);
        loginSendTimestamp = System.currentTimeMillis();
 
 
 
        try {
            connection.connect();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
 
        loginReplyReceived = daemonLoginReplyLatch.await(30000, TimeUnit.MILLISECONDS);
        return loginReplyReceived;
}
вопрос состоит в том, какой алгоритм далее соблюдать? Создать класс-поток, в котором будет реализован функционал соединения с сервером, приема и передачи запросов (метод init() в том числе будет в этом классе), а его уже в свою очередь вызывать из двух других классов-потоков, в которых нужно будет указывать параметры подключения, что отправлять, обрабатывать ответы (мне нужно будет держать два соединения одновременно, но отправлять нужно разные запросы)?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
16.02.2015, 18:43
Помогаю со студенческими работами здесь

ASP.NET Core. Как лучше организовать работу со скриптами JS?
Собственно, вот и весь вопрос. Скидываю все скрипты в файл site.js Большинство скриптов будут использоваться только на одной странице, но...

Как лучше организовать работу Access с данными из разных файлов Excel
Задача в следующем. В базе Access есть список путей до типовых файлов Excel, откуда нужно взять данные. Связывание БД с этими...

Как сократить кол-во почти одинаковых строчек кода?
Можно ли это как-нибудь упростить? Выглядит достаточно громоздко. Спасибо. btnQ.Enabled:=True; btnW.Enabled:=True; ...

Организовать взаимосвязь документов по принципу дерева
Здравствуйте, уважаемые участники форума! Передо мной поставлена задача: Дана сущность документа: идентификатор, комментарий, ссылка...

Как организовать создание потоков?
Подскажите pls как правильно организовать создание потоков если заранее неизвестно сколько их будет но алгоритм работы каждого потока ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru