Форум программистов, компьютерный форум, киберфорум
Наши страницы
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
outZoNe
6 / 4 / 3
Регистрация: 18.02.2014
Сообщений: 394
1

Синхронизация потоков wait и notify

11.04.2016, 01:24. Просмотров 846. Ответов 3
Метки нет (Все метки)

Народ помогите понять. Делаю два анонимных внутренних класса. Суть в том что второй анонимный класс находиться в ожидании, а первый когда отработает должен запустить через notify второй ждущий класс я правильно понимаю и делаю?
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
import java.applet.Applet;
import java.awt.Label;
 
public class Qwe extends Applet {
    Label l1 = new Label("start");
    int i  = 0;
    boolean flag = true;
 
    public void init() {
        setSize(200,200);
        add(l1);
        t1.start();
        t2.start();
    }
    
    Thread t1 = new Thread(new Runnable() {
        public void run() {
            while(i < 5){
                i++;
                l1.setText("" + i);
                try {
                    Thread.sleep(150);
                } catch (InterruptedException ex) {}
            }
            synchronized(t2){
                t2.notify();
            }
        }
    });
    
    Thread t2 = new Thread(new Runnable() {
        public synchronized void run() {
            while(flag){
                synchronized(t2){
                    try {
                        t2.wait();
                    } catch (InterruptedException ex) {}
                }
            }
            while(i > 0){
                i--;
                l1.setText("" + i);
                try {
                    Thread.sleep(150);
                } catch (InterruptedException ex) {}
            }
        }
    });
}
Добавлено через 1 минуту
Получается что первый класс отрабатывает накручивает i до 5, а потом вся программа останавливается и все
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.04.2016, 01:24
Ответы с готовыми решениями:

Задача о синхронизации потоков только методами wait и notify
Привет всем! Я не могу понять почему мой код не работает. задание: ...

Потоки. Wait, notify
Нужно создать программу, реализующую работу с потоками с помощью wait, notify....

Многопоточность. wait(), notify()
Здравствуйте, в Шилдте есть пример: //Правильная реализация поставщика и...

Методы wait() и notify()
class Blocked { public synchronized void doWait() { try { ...

Особенности поведения методов wait, notify, notifyAll
Доброго времени суток. Возникло несколько вопросов связанных с поведением...

3
snajper_ro
103 / 88 / 51
Регистрация: 14.09.2011
Сообщений: 568
Записей в блоге: 1
11.04.2016, 08:46 2
Лучший ответ Сообщение было отмечено outZoNe как решение

Решение

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
public class T1 extends JFrame{
    Label l1 = new Label("start");
    int i  = 0;
    boolean flag = true;
    
    public T1() {
        this.add(l1);
        this.pack();
    }
    
    public void init() {
        t1.start();
        t2.start();
        this.add(l1);
    }
    
    Thread t1 = new Thread(new Runnable() {
        public void run() {
            while(i < 5){
                System.out.println("t1 "+ i);
                i++;
                l1.setText("" + i);
                try {
                    Thread.sleep(150);
                } catch (InterruptedException ex) {}
            }
            synchronized(t2){
                t2.notify();
            }
        }
    });
    
    Thread t2 = new Thread(new Runnable() {
        public synchronized void run() {
            while(flag){
                synchronized(t2){
                    try {
                        t2.wait();
                    } catch (InterruptedException ex) {}
                }
            }
            while(i > 0){
                i--;
                l1.setText("" + i);
                System.out.println("t2 "+ i);
                try {
                    Thread.sleep(150);
                } catch (InterruptedException ex) {}
            }
        }
    });
    public static void main(String[] args) {
        T1 t = new T1();
        
        t.setVisible(true);
        t.init();
    }
}
оно во первых ждать будет вечно
Java
1
 while(flag){
1
outZoNe
6 / 4 / 3
Регистрация: 18.02.2014
Сообщений: 394
17.04.2016, 22:48  [ТС] 3
snajper_ro, Простите что так долго не отвечал. Так как сделать что бы ждущий поток запускался по методу notify. В вашем пример по сути тоже что и у меня и тоже не работает

Добавлено через 2 минуты
snajper_ro, Ой простите, я понял что вы хотели сказать этим: "
Цитата Сообщение от snajper_ro Посмотреть сообщение
оно во первых ждать будет вечно
*while(flag){
"
сделал что бы менялся flag и все заработало)

Добавлено через 1 час 16 минут
snajper_ro, Если вас не затруднит можете объяснить как можно сделать что бы два потока вызывали по очереди друг друга бесконечно сделал так, но теперь первый поток накручивает i до 3, а второй уменьшает i до 0 и вся программа останавливается.
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
package javaapplication3;
 
import java.applet.Applet;
import java.awt.Label;
 
public class JavaApplication3 extends Applet {
    Label l1 = new Label("start");
    int i  = 0;
    boolean flag1 = false;
    boolean flag2 = true;
 
    public void init() {
        setSize(200,200);
        add(l1);
        t1.start();
        t2.start();
    }
    
    Thread t1 = new Thread(new Runnable() {
        public void run() {
            while(flag1){
                synchronized(t1){
                    try {
                        t1.wait();
                    } catch (InterruptedException ex) {}
                }
            }
            while(i < 3){
                i++;
                l1.setText("" + i);
                try {
                    Thread.sleep(220);
                } catch (InterruptedException ex) {}
            }
            synchronized(t2){
                flag1 = true;
                flag2 = false;
                t2.notify();
            }
        }
    });
    
    Thread t2 = new Thread(new Runnable() {
        public void run() {
            while(flag2){
                synchronized(t2){
                    try {
                        t2.wait();
                    } catch (InterruptedException ex) {}
                }
            }
            while(i > 0){
                i--;
                l1.setText("" + i);
                try {
                    Thread.sleep(222);
                } catch (InterruptedException ex) {}
            }
            synchronized(t1){
                flag2 = true;
                flag1 = false;
                t1.notify();
            }
        }
    });
}
0
snajper_ro
103 / 88 / 51
Регистрация: 14.09.2011
Сообщений: 568
Записей в блоге: 1
18.04.2016, 10:39 4
Я думаю, что вы достаточно знаете что бы это сделать.
Я вам подскажу, как вам дойти до этого решения.
Для начала, создайте новый проект. И напишите вызов потока а, из потока б., теперь в отдельном файле сделайте наборот. б вызывает а. без каких циклов, и булеан тип.

После чего попытайтесь добавить циклы.

А лучше взять книгу по потоком и ее изучить- это самый серьезный вариант для самых серьезных ребят.
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.04.2016, 10:39

Обращение к файлу. wait(), notify(), notifyAll(), Runnable
&quot;Продемонстрировать программу, в которой разные потоки обращаются к файлу,...

Почему методы wait() и notify() объявлены в классе Object, а не Thread?
никак не могу разобраться

Потоки: как правильно работать с wait(), notify() и synchronized() на примере задачи?
Задача: Есть производитель машин - Factory. Есть потребитель - Dealer. Они...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru