powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Момогите разобраться с потоками
2 сообщений из 2, страница 1 из 1
Момогите разобраться с потоками
    #38296244
Monah83
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Задание: первый поток генерирует в буфер 100 значений в интервале от 1 до 100; второй поток извлекает максимальное и отчищает буфер

Код: 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.
import java.util.ArrayList;
public class Q {
        /**
     * @param args the command line arguments
     */
    public static void main(String[] args) throws InterruptedException {
        // 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();
          //  ob1.t1.join();
          //  ob2.t2.join();
            
      }
}
blic 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());
            }
        }
    }
}
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 / 0
Момогите разобраться с потоками
    #38296604
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Monah83,
Код: 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.
import java.util.ArrayList;
import java.util.Collections;

public class Q {

	public static void main(String[] args) throws InterruptedException {
		ArrayList<Integer> buffer = new ArrayList<Integer>();
		new FirstThread(buffer);
		new SecondThread(buffer);
	}
}

class FirstThread implements Runnable {

	ArrayList<Integer> buffer;
	Thread t1;
	final int N = 16;

	public FirstThread(ArrayList<Integer> buffer) {
		this.buffer = buffer;
		t1 = new Thread(this);
		t1.start();
	}

	public void run() {
		synchronized (buffer) {
			for (int i = 1; i <= 100 && buffer.size() < N; i++) {
				java.util.Random random = new java.util.Random();
				int y = random.nextInt(15) + 1;
				buffer.add(y);
				System.out.println("+++ В буфер добавлено: " + y
						+ " Размер буфера: " + buffer.size());
			}
		}
	}
}

class SecondThread implements Runnable {
	ArrayList<Integer> buffer;
	double znach = 0;
	int counter = 0;
	Thread t2;
	final int N = 16;

	public SecondThread(ArrayList<Integer> buffer) {
		this.buffer = buffer;
		t2 = new Thread(this);
		t2.start();
	}

	public void run() {
		while (counter < N) {
			searchMAX();
		}
	}

	private void searchMAX() {
		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 / 0
2 сообщений из 2, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Момогите разобраться с потоками
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]