Форум программистов, компьютерный форум, киберфорум
Java
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/9: Рейтинг темы: голосов - 9, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 13.06.2013
Сообщений: 6
1

Не запускается второй поток

13.06.2013, 12:53. Показов 1682. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Задача: первый поток генерирует в буфер 100 чисел, в интервале от 1 до 16; второй поток извлекает максимальное значение из буфера и отчищает его.
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
package q;
 
import java.util.ArrayList;
public class Q {
        /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        ArrayList<Integer> buffer = new ArrayList<Integer>();
        FirstThread ob1 = new FirstThread(buffer);
        SecondThread ob2 = new SecondThread(buffer);
        
        // ожидание завершения потоков
        
            ob1.t1.start();
            ob2.t2.start();
      }
}
package q;
 
import java.util.ArrayList;
 
public class FirstThread implements Runnable {
 
private ArrayList<Integer> buffer; //переменная для хранения буфера счислами
Thread t1;
public FirstThread(ArrayList<Integer> buffer){
    this.buffer = buffer;
    t1 = new Thread(this);
    t1.start();
}
/**
 * Задаче метода - заполнить буфера числами.
 * Если буфер  переполнен, то поток уходит в сон.
 */
public void run(){
    synchronized (buffer){
        int N = 16;//максимальный размер буффера
         for (int i = 1; i <= 100; i++){
            while (buffer.size() > N - 1){
                try{
                    buffer.wait();
                } catch (InterruptedException e){
                    System.out.println("InterruptedException перехвачено");
                }
            }
            java.util.Random random = new java.util.Random();
            int y = random.nextInt(15)+1;
            buffer.add(y);
            System.out.println("+++ В буфер добавлено:" + y + "  Размер буфера:" + buffer.size());
            }
        }
    }
}
package q;
import java.util.ArrayList;
import java.util.Collections;
 
public class SecondThread implements Runnable {
    private ArrayList<Integer> buffer; //переменная для хранения буфера с числами
    private double znach = 0;//переменная для хранения максимального значенмя
    private int counter = 0;// счетчик
    Thread t2;
    
    public SecondThread(ArrayList<Integer> buffer){
        this.buffer = buffer;
        t2 = new Thread(this);
        t2.start();
    }
    public void run(){
        while (counter < 100){
            searchMAX();
            synchronized (buffer){
            buffer.notify();
            }
        }
    }
    private void searchMAX(){
        while(buffer.size()==0){
        synchronized (buffer){
            try {
            buffer.wait();
            }catch (InterruptedException e){
            System.out.println(e.getMessage());
            }
          }
        }
        float znach =0;
        synchronized (buffer){
            Collections.sort(buffer);
            znach = buffer.get(buffer.size()-1);
            buffer.remove(buffer.size()-1);
            counter++;
        }
        System.out.println("Максимальное значение" + znach);
    }
}
Проблема в том что не запускается второй поток, не могу разобраться почему.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.06.2013, 12:53
Ответы с готовыми решениями:

Не запускается 2й поток паралельно в Linux Debian 10
Всем доброе время суток. Что Я не так делаю при программирование потоков на Java, запускаю код: ...

Не запускается второй поток
Не понимаю, но такое ощущение, что второй поток не запускается(MessageBox не выводится). Первый...

OnTimer и второй поток
добрый день. у меня возникла следующая проблема. в обработчике таймера я вывожу время и...

Не запускается поток
Доброго времени суток! Может кто подсказать, почему возникает ошибка? Первый раз поток не...

5
2000 / 1427 / 92
Регистрация: 25.11.2010
Сообщений: 3,611
13.06.2013, 13:06 2
Я правильно понимаю, что Вы сначала запускаете потоки в конструкторе, а потом еще раз из основного класса?
0
0 / 0 / 0
Регистрация: 13.06.2013
Сообщений: 6
13.06.2013, 13:49  [ТС] 3
Вроде да, честно с Java знаком плохо.

Добавлено через 40 минут
public static void main(String[] args) {
// TODO code application logic here
ArrayList<Integer> buffer = new ArrayList<Integer>();
FirstThread ob1 = new FirstThread(buffer);
SecondThread ob2 = new SecondThread(buffer);

если убрать эти строки то ошибка пропадает, но второй поток все равно не запускается

ob1.t1.start();
ob2.t2.start();

}
}
0
2000 / 1427 / 92
Регистрация: 25.11.2010
Сообщений: 3,611
13.06.2013, 15:33 4
А чего Вы хотели добиться повторным запуском? Просто интересно.

И что значит "не запускается"? Как это проявляется?
1
0 / 0 / 0
Регистрация: 13.06.2013
Сообщений: 6
13.06.2013, 15:56  [ТС] 5
Там объем буфера на 16 значений, первый поток генерирует 16 значений и программа уходит в ожидание. Второй поток вообще не отрабатывает.
0
2000 / 1427 / 92
Регистрация: 25.11.2010
Сообщений: 3,611
13.06.2013, 18:46 6
А Вы абсолютно уверены, что не отрабатывает? Поставьте в searchMAX первой строкой какой-нибудь System.out.println("searchMAX");.
0
13.06.2013, 18:46
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.06.2013, 18:46
Помогаю со студенческими работами здесь

Не запускается поток
Написал функция для обхода подпапок и поиска в ней файлов с расширением .txt, например. В один...

Не запускается повторно поток.
Собственно есть поток: Dim a1 As New System.Threading.Thread(AddressOf test) Sub test()...

Delphi. Поток не запускается
Здравствуйте, столкнулся с очень необычной штукой, по крайней мере для меня. Созданные потоки и он...

Не запускается поток мультикаста
Помогите решить задачу: Есть IP домофон внутренний и внешний блок на линуксе, соединены через...

Почему не запускается поток?
Инициализирую массив из другого класса .При нажатии кнопки массив выводится в listView. Пытаюсь...

Не запускается несколько раз поток
Не могу запустить второй раз поток ... public partial class Form1 : Form { bool...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru