Выполнение действия, когда список достигает определенной суммы - PullRequest
1 голос
/ 04 мая 2019

У меня есть тема, которая добавляет соединения в список. Мое приложение должно выбрать 2 случайных элемента, когда список становится больше, чем два элемента.

После этого программа выполняет некоторые действия с соединениями, а затем удаляет два соединения из списка.

Я уже пытался запустить отдельный поток и проверить, больше ли список, чем 2 элемента.

Когда он больше, он выбирает 2 случайных элемента из списка и выполняет с ними действие, а затем удаляет их из списка.

Есть ли лучший способ сделать это с помощью шаблона проектирования? Я не думаю, что запуск другого потока, который продолжает проверять, больше ли список, чем 2, является хорошим решением.

1 Ответ

1 голос
/ 04 мая 2019

Вы можете решить проблему с проблемой потребителя производителя, когда один поток проверяет размер списка, а когда размер достигает 2, другие потоки начинают потреблять (удалять) из списка. И добавление, и удаление в поток должны выполняться через синхронизированные блоки, чтобы не возникало расхождений.

Вы можете попробовать подход ниже для вашей проблемы.

`

import java.util.LinkedList; 

public class Threadexample 
{ 
    public static void main(String[] args) throws InterruptedException { 
        // Object of a class that has both produce() 
        // and consume() methods 
        final PC pc = new PC();
    // Create producer thread 
    Thread t1 = new Thread(new Runnable() 
    { 
        @Override
        public void run() 
        { 
            try
            { 
                pc.produce(); 
            } 
            catch(InterruptedException e) 
            { 
                e.printStackTrace(); 
            } 
        } 
    }); 

    // Create consumer thread 
    Thread t2 = new Thread(new Runnable() 
    { 
        @Override
        public void run() 
        { 
            try
            { 
                pc.consume(); 
            } 
            catch(InterruptedException e) 
            { 
                e.printStackTrace(); 
            } 
        } 
    }); 

    // Start both threads 
    t1.start(); 
    t2.start(); 

    // t1 finishes before t2 
    t1.join(); 
    t2.join(); 
} 

// This class has a list, producer (adds items to list 
// and consumer (removes items). 
public static class PC 
{ 
    // Create a list shared by producer and consumer 
    // Size of list is 2. 
    LinkedList<Integer> list = new LinkedList<>(); 
    int capacity = 2; 

    // Function called by producer thread 
    public void produce() throws InterruptedException 
    { 
        int value = 0; 
        while (true) 
        { 
            synchronized (this) 
            { 
                // producer thread waits while list 
                // is full 
                while (list.size()==capacity) 
                    wait(); 

                System.out.println("Producer produced-"
                                            + value); 

                // to insert the jobs in the list 
                list.add(value++); 

                // notifies the consumer thread that 
                // now it can start consuming 
                notify(); 

                // makes the working of program easier 
                // to understand 
                Thread.sleep(1000); 
            } 
        } 
    } 

    // Function called by consumer thread 
    public void consume() throws InterruptedException 
    { 
        while (true) 
        { 
            synchronized (this) 
            { 
                // consumer thread waits while list 
                // is empty 
                while (list.size()==0) 
                    wait(); 

                //to retrive the ifrst job in the list 
                int val = list.removeFirst(); 

                System.out.println("Consumer consumed-"
                                                + val); 

                // Wake up producer thread 
                notify(); 

                // and sleep 
                Thread.sleep(1000); 
            } 
        } 
    } 
} 

} `

посмотри здесь https://www.geeksforgeeks.org/producer-consumer-solution-using-threads-java/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...