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

Синхронизация потоков. Простенький пример

10.07.2014, 11:40. Показов 1706. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте уважаемые форумчане! Прошу помощи экспертов! Дано 3 класса...

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
public class Data {
    private int state = 1;
    
    public int getState(){
        return state;
    }
    
    public void Tic(){
        System.out.print("Tic");
        state = 2;
    }
    
    public void Tac(){ 
        System.out.print("Tac");
        state = 3;
    }
    public void Tuc(){ 
        System.out.println("Tuc");
        state = 1;    
    }
}
 
 
public class Worker1 extends Thread{
    private int id;
    private Data data;
 
    public Worker1(int id, Data d) {
        this.id = id;
        this.data = d;
        this.start();
    }
 
    @Override
    public void run() {
        synchronized (data){
            for (int i = 0; i < 5; i++){
                try{ 
                    while(id != data.getState()){
                        data.wait();
                    }
                    if (id == 1){
                        data.Tic();
                    }
                    else if (id == 2){
                        data.Tac();
                    }
                    else if (id == 3){
                        data.Tuc();
                    }
                    data.notify();    
                }
                catch(InterruptedException exc){}
            }
        }
    }    
}
 
 
public class Main {
    
    public static void main(String[] args) throws InterruptedException {
        Data d = new Data();
        Worker1 w1 = new Worker1(1, d);
        Worker1 w2 = new Worker1(2, d);
        Worker1 w3 = new Worker1(3, d);       
        
        w3.join();
        System.out.println("end of main...");
    }
    
}

...я пытаюсь сделать так, чтобы каждый класс отработал по 5 раз по порядку, один поток, потом другой, затем третий. В итоге должно выдать:
TicTacTuc
TicTacTuc
TicTacTuc
TicTacTuc
TicTacTuc
end of main...

При запуске программа подвисает. Исчеркал кучу бумаги, не могу разобраться в чем дело.
Прошу помощи экспертов, направьте на путь истинный!
Заранее тысячу Спасибо!
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
10.07.2014, 11:40
Ответы с готовыми решениями:

Синхронизация потоков
Требуется: Выполнить приложение командной строки с двумя параметрами , один из которых – количество потоков, другой параметр – количество...

Синхронизация потоков
Пытаюсь синхронизировать потоки, но не очень выходит. Какого вывода я ожидаю: Поток №1 Поток №2 Поток №3 Поток №1 Поток №2 ...

Синхронизация потоков
Столкнулся с непонятной проблемой.Хочу решить задачу типа два потока заполняют буфер по очереди. Сначала поток А выводит символ...

2
51 / 51 / 42
Регистрация: 06.09.2013
Сообщений: 188
10.07.2014, 18:53
alexeyenko, вот я могу предложить так сделать

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
118
119
120
121
122
123
124
125
126
127
128
129
class Call {
    
    private boolean flagTic;
    private boolean flagTac;
    private boolean flagTuc;
    
    public Call() {
        
        flagTic = false;
        flagTac = true;
        flagTuc = true;
    }
    
    public void printTic() {
        
        while(flagTic)  {
            try {
                wait();
            }
            catch(Exception exc) {
                exc.printStackTrace();
            }
        }
            
        flagTic = true;
        flagTac = false;
 
        System.out.print("Tic");
        notifyAll();
 
    }
    
    public void printTac() {
        
        while(flagTac)  {
            try {
                wait();
            }
            catch(Exception exc) {
                exc.printStackTrace();
            }
        }
            
        flagTac = true;
        flagTuc = false;
        
        System.out.print("Tac");
        notifyAll();
    }
    
    public void printTuc() {
 
        while(flagTuc)  {
            try {
                wait();
            }
            catch(Exception exc) {
                exc.printStackTrace();
            }
        }
        
        flagTic = false;
        flagTuc = true;
 
        System.out.print("Tuc\n");
        notifyAll();
        
    }
}
 
class Caller implements Runnable {
 
    private Call call;
    private Thread t;
    private String str;
    
    public Caller(Call call, String str) {
 
        this.str = str;
        this.call = call;
        t = new Thread(this);
        t.start();
    }
    
    public Thread getThread() {
        return this.t;
    }
    
    @Override
    public void run() {
        
        for(int i = 0; i < 5; ++i) {
            
            synchronized(this.call) {
                
                if(str.equals("Tic")) 
                    this.call.printTic();
                else if(str.equals("Tac")) 
                    this.call.printTac();
                else 
                    this.call.printTuc();
            }
        }
    }   
}
 
public class Main {
    
    public static void main(String[] args)  {
        
        Call call = new Call();
        
        Caller w1 = new Caller(call, "Tic");
        Caller w2 = new Caller(call, "Tac");
        Caller w3 = new Caller(call, "Tuc");       
        
        try {
            w1.getThread().join();
            w2.getThread().join();
            w3.getThread().join();
        }
        catch(Exception exc) {
            exc.printStackTrace();
        }
        
        System.out.println("end of main...");
    }
    
}
0
 Аватар для lemegeton
4903 / 2696 / 921
Регистрация: 29.11.2010
Сообщений: 5,783
11.07.2014, 21:25
А вообще, вам достаточно поменять
Java
1
data.notify();
на
Java
1
data.notifyAll();
и все будет работать, как ожидается.

Конечно, еще джойнить надо все три потока, а не только один. Иначе у вас прога кончится рановато.

Еще неплохо бы
Java
1
private final Data data;
И убрать вызов метода start из конструктора.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
11.07.2014, 21:25
Помогаю со студенческими работами здесь

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

Синхронизация потоков
Начал изучать Java 8 по книге. Наткнулся на пример искусственной реализации приостановки и возобновления потоков. Main.java public...

Синхронизация потоков
Добрый день. Нужно решить уравнение методом хорд и методом касательных. Решаться должно одновременно в двух разных потоках. Поток, который...

Синхронизация потоков в Java
Если есть блок synchronyzed то в него нужно передать Object да? То есть если главный поток зашел в блок synchronyzed то id объекта Object...

Синхронизация потоков. Java
Всем доброго времени суток, нужна помощь в реализации синхронизации потоков на Java, не очень понимаю данную тему, вот взял задание и не...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а привычная функция main(). . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru