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

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

10.07.2014, 11:40. Показов 1711. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Чистый C и C++ в Qt Creator: ставим среду без VPN и настраиваем MinGW/CMake, без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru