Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/7: Рейтинг темы: голосов - 7, средняя оценка - 5.00
Форумчанин
5959 / 4193 / 406
Регистрация: 28.12.2013
Сообщений: 24,134

Синхронизация или "ожидалка" для потока

04.06.2014, 21:24. Показов 1366. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Допустим ,наша программа выполняет опеределенные действия ,которые запускают поток.

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

Пробовал синхронизировать метод который запускает поток - не помогло

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

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
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
 
import javax.swing.JButton;
import javax.swing.JFrame;
 
 
public class test extends JFrame {
    
    static test test = new test();
    JButton b;
    Thread t;
    
    public static void main(String[] args) {
        
        test.init();
        
    }
    
    private void init() {
        
        frame();
        buttons();
        
    }
    
    private void frame(){
        setSize(100, 100);
        setLocationRelativeTo(null);
        setVisible(true);
        setDefaultCloseOperation(3);
        setLayout(new FlowLayout());
    }
    
    private void buttons(){
        
        b = new JButton();
        b.addActionListener(new ActionListener(){
 
            @Override
            public void actionPerformed(ActionEvent e) {
                
                start();
                
            }
            
        });
        add(b);
        
    }
    
    private void start(){
        
        t = new Thread(new Runnable(){
 
            @Override
            public void run() {
                
                for(int i = 0;i<=5;i++){
                    System.out.println(i);
                    try {
                        Thread.sleep(500);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
            
            }
            
        });
        t.start();
    }
 
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
04.06.2014, 21:24
Ответы с готовыми решениями:

Синхронизация потока
Имеется поток, ошибка в wsocket1.Как синхронизовать? procedure tzon.execute; var t:integer; begin WSocket1.Sendline('JOIN...

Синхронизация потока
Здравствуйте! Подскажите пожалуйста как вывести элементы массива из потока. (Задание: В теле main(), после окончания работы потоков...

Создание и синхронизация потока
Здравствуйте, нужно решить такую проблему: подсчитать кол-во символов в edit в фоновом потоке, и вывести число в static (потоки...

16
Эксперт Java
 Аватар для turbanoff
4094 / 3828 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 12
04.06.2014, 23:39
Цитата Сообщение от WyPik Посмотреть сообщение
программа может запросить выполнение этого действия недожидаясь завершения уже запущенного потока
А чтобы вы хотели чтобы она делала? Ждала завершения потока, или добавила в очередь его? Или можно просто выдало бы пользователю сообщение?
На всякий случай: для определения работает ли поток или нет, есть метод Thread.isAlive()
1
Форумчанин
5959 / 4193 / 406
Регистрация: 28.12.2013
Сообщений: 24,134
05.06.2014, 00:05  [ТС]
Цитата Сообщение от turbanoff Посмотреть сообщение
А чтобы вы хотели чтобы она делала?
в коде, что я скинул ,есть программа с кнопкой,если нажать кнопку,затем недожидаясь завершения потока нажать ее еще раз,то оба потока начнуть выполняться параллельно

мне нужно вот как - после начала работы программы второй поток при нажатии на кнопку повторно не должен запускаться пока 1й поток не закончится

Цитата Сообщение от turbanoff Посмотреть сообщение
есть метод Thread.isAlive()
про него знаю,но все равно спасибо.

как обычно может оказаться что решение вопрос это буквально пара строчек просто могу его банально незамечать в упор.
0
44 / 44 / 11
Регистрация: 21.01.2013
Сообщений: 668
05.06.2014, 00:40
Цитата Сообщение от WyPik Посмотреть сообщение
второй поток при нажатии на кнопку повторно не должен запускаться пока 1й поток не закончится
вам нужно использовать метод join.

Но код придётся порефакторить.

сделайте филд Thread currentThread. это будет поток, который сейчас исполняется.

и перед t.start() вызывайте currentThread.join()

Добавлено через 1 минуту
WyPik, хотя это костыль тут - сделать метод синхронизованным - это правильное решение.

Добавлено через 57 секунд
WyPik,
Java
1
private void start()
вот этот метод
1
Форумчанин
5959 / 4193 / 406
Регистрация: 28.12.2013
Сообщений: 24,134
05.06.2014, 00:45  [ТС]
я пробовал его синхронизировать,все так же работает,про джоины не понял,завтра почитаю про них
0
44 / 44 / 11
Регистрация: 21.01.2013
Сообщений: 668
05.06.2014, 00:53
Цитата Сообщение от WyPik Посмотреть сообщение
я пробовал его синхронизировать,все так же работает
ты чего-то не договариваешь....всё будет работать. Наверное ты как-то не так синхронизуешь просто. монитором должен быть объект.
0
Форумчанин
5959 / 4193 / 406
Регистрация: 28.12.2013
Сообщений: 24,134
05.06.2014, 00:56  [ТС]
Java
1
private synchronized void start()
- не?
по крайней мере в многих примерах так видел
0
Эксперт Java
 Аватар для turbanoff
4094 / 3828 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 12
05.06.2014, 01:19
WyPik, Тогда еще один вопрос, если пользователь нажмет три раза подряд на кнопку, сколько раз должен отработать второй поток? Три или два (потому что третье нажатие будет во время "ожидания" второго)?
0
Форумчанин
5959 / 4193 / 406
Регистрация: 28.12.2013
Сообщений: 24,134
05.06.2014, 01:36  [ТС]
второй поток должен жить пока условие истинно,вне зависимости сколько раз жать на кнопку.

1 нажатие на кнопку запускает поток,последующие нажатия должны ждать пока поток закроется и не открывать параллельные ему потоки.

Добавлено через 9 минут
ну понятное дело можно создать еще 1 поток, который в режиме реального времени будет чекать жив ли 1й поток
К сожалению крайне глупая затея которая приводит к жору ресурсов
0
Эксперт Java
 Аватар для KEKCoGEN
2399 / 2224 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
05.06.2014, 01:53
Отключайте кнопку на время выполнения задачи. Если потоки все равно выполняются последовательно, держать кнопку включенной нет смысла.
1
Форумчанин
5959 / 4193 / 406
Регистрация: 28.12.2013
Сообщений: 24,134
05.06.2014, 01:56  [ТС]
она не только для потоков нужна.Кнопка должна сохранять функционал вне зависимости от состояния потока.
0
12 / 12 / 2
Регистрация: 28.04.2014
Сообщений: 31
05.06.2014, 08:33
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
private synchronized void start() throws InterruptedException {        
    Thread t0 = new Thread(new Runnable(){ 
        @Override
        public void run() {          
            try {      
                for(int i = 0;i<=5;i++){
                    System.out.println(i);
 
                    try {
                        Thread.sleep(500);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }     
            }
            finally {
                assert Thread.currentThread() == t;
 
                t = null;
 
                notifyAll();
            }
        }            
    });
 
    while (t != null)
        wait();
 
    t = t0;
 
    t0.start();
}
1
44 / 44 / 11
Регистрация: 21.01.2013
Сообщений: 668
05.06.2014, 09:56
Цитата Сообщение от DEVcoach Посмотреть сообщение
while (t != null)
* * * * wait();
t = t0;
я конечно понимаю, что работать будет и с этим, но зачем?
0
12 / 12 / 2
Регистрация: 28.04.2014
Сообщений: 31
05.06.2014, 11:49
gredwhite,
Вы правильно заметили. Во-первых, это действительно можно сделать проще через простой Thread.join() внутри synchronized. А во-вторых, мое решение некорректно, так как обнуление поля t из другого потока происходить без синхронизации,
следовательно, у нас data race.
Так что прошу мое решение игнорировать, как некорректное.
0
Форумчанин
5959 / 4193 / 406
Регистрация: 28.12.2013
Сообщений: 24,134
05.06.2014, 20:16  [ТС]
ммм,ну вобщем сделал тему с джоинами и понял что они мне не подходят.

Может я что-то не так понял,поправте меня.При нажатии на кнопку дважны,сначала идет выполнение 1 потока а вслед за ним второго,тоесть они уже стали последовательными а не параллельными.

Мне нужно чтоб при выполнении 1 потока,при условии что он не завершен,второй вообще не начинал бы волняться.Начало второго потока возможно было бы только после окончания первого,но не в режиме очереди как в случае с дожином.
0
Эксперт Java
 Аватар для KEKCoGEN
2399 / 2224 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
05.06.2014, 21:15
пока поток работает, выставляйте переменную working. При нажатии на кнопку, смотрите значение переменной и решайте запускать ли поток
0
Форумчанин
5959 / 4193 / 406
Регистрация: 28.12.2013
Сообщений: 24,134
05.06.2014, 22:02  [ТС]
Цитата Сообщение от KEKCoGEN Посмотреть сообщение
пока поток работает, выставляйте переменную working. При нажатии на кнопку, смотрите значение переменной и решайте запускать ли поток
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
package test.threads;
 
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
 
import javax.swing.JButton;
import javax.swing.JFrame;
 
public class test extends JFrame {
 
    static test test = new test();
    JButton b;
    Thread t;
    boolean check;
 
    public static void main(String[] args) {
 
        test.init();
 
    }
 
    private void init() {
 
        frame();
        buttons();
 
    }
 
    private void frame() {
        setSize(100, 100);
        setLocationRelativeTo(null);
        setVisible(true);
        setDefaultCloseOperation(3);
        setLayout(new FlowLayout());
    }
 
    private void buttons() {
 
        b = new JButton();
        b.addActionListener(new ActionListener() {
 
            @Override
            public void actionPerformed(ActionEvent e) {
 
                if (check) {
                    return;
                }
                start();
            }
 
        });
        add(b);
 
    }
 
    private void start() {
 
        t = new Thread(new Runnable() {
 
            @Override
            public void run() {
 
                for (int i = 0; i <= 5; i++) {
                    System.out.println(i);
                    try {
                        Thread.sleep(500);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
                check=false;
            }
 
        });
        check = true;
        t.start();
 
    }
 
    void test() {
        try {
            t.join();
        } catch (InterruptedException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
    }
 
}
добавлена переменная чек,я правильно понял?

Добавлено через 36 минут
впринципе этот вариант я рассматривал изначально,но думал,может есть уже готовое решение в классах явы.
Пришлось вобщем немного переписать реализацию кнопки исходя из последнего тестового кода что я добавил (из-за этого и хотел найти другое решение).
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
05.06.2014, 22:02
Помогаю со студенческими работами здесь

Синхронизация процессов или нитей для обновления UI
1)Модель приложения должна работать как отдельный поток или отдельный процесс(поскольку она содержит бесконечный цикл для принятия...

Синхронизация потока с рекурсивной функцией
Пытаюсь осваивать многотопоточность. Делаю задачу, которую сам придумал :) Итак, есть два класса. Один класс implements Runnable,...

Синхронизация чужого потока с моей формой
Имею DLL, в которую для организации Callback функций отправляю указатель на функцию обратного вызова. procedure...

Синхронизация вычислений рабочего потока и отрисовки в UI потоке
В общем в Ui потоке должна идти пошаговая отрисовка ячеек, которые лежат в GridView, а в рабочем созданном потоке производятся вычисления...

Потоки. Синхронизация. Передача параметра при создании потока.
Здравствуйте! Разбираюсь с потоками. Возникли проблемы то ли с синхронизацией, то ли с созданием потоков и передачей в потоковую функцию...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru