Palestinian gamer Ответов: 2

Как я могу каждый раз отправлять числа в определенный буфер


Suppose a router (main router) sends integer data to other 5 routers (router1, router2, router3, router4, router5) by saving the data in special buffers (5 output buffers: buffer1, buffer2, buffer3, buffer4, buffer5) located in the router itself and the other 5 routers read these data from these buffers each from its own special buffer (router1 reads from buffer1, router2 reads from buffer2, and so on). Each buffer has a limited size to 5. i.e. each buffer can save up to 5 integer numbers. Now, write a program (contains 6 threads) one thread for the main router that generates random integers and saves them in the 5 buffers randomly (it selects the buffer to save in randomly) and the other 5 threads for the 5 routers that their job is to read data from their corresponding buffers. The code has to implement the following rules:

1- The main router thread waits for 10 ms after each filling of some router of data.

2- The main router notifies all other threads that some data are written inside the buffers.

3- Other threads, after reading some data from buffers, they delete read data from the buffers.

4- The main router has to wait till a space is available in the buffers.

5- The other threads have to wait if buffers are empty (of course each thread waits for its corresponding buffer).

6- Other threads have to wait for 10 ms after each read.


Что я уже пробовал:

сделайте массив но мой доктор сказал что вы можете обойтись и без массива

2 Ответов

Рейтинг:
14

OriginalGriff

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

Поэтому нам нужно, чтобы вы сделали работу, и мы поможем вам, когда вы застряли. Это не значит, что мы дадим вам пошаговое решение, которое вы можете сдать!
Начните с объяснения, где вы находитесь в данный момент и каков следующий шаг в этом процессе. Затем расскажите нам, что вы пытались сделать, чтобы этот следующий шаг сработал, и что произошло, когда вы это сделали.


Palestinian gamer

Я сделал большую часть этого, но застрял на том, как создать 5 буферов

Рейтинг:
1

Palestinian gamer

package project.pkg2.thread;
import java.util.concurrent.*;
 import java.util.concurrent.locks.*;
public class Project2Thread {
    public static buffer buffer;

    public static void main(String[] args) {
     ExecutorService executor = Executors.newFixedThreadPool(6);  
      
       executor.execute(new mainrouter());
                        

          executor.execute(new fiverouter());
        
        
        
        executor.shutdown();
     }
    public static class mainrouter implements Runnable{
    public void run(){
    try {
          while(true){     
       
                System.out.println("main router send  " );
                 
                     
                   
                    
                     
                 
   
                 buffer.save((int) (Math.random()*10) + 1);
                            Thread.sleep( 1/100);
                }
            }
            catch (InterruptedException ex) {
                ex.printStackTrace();
            }
        }}
    public static class fiverouter implements Runnable{ 
        
        
        public void run(){
   try{
       System.out.println("buffer read"+buffer.read());
       
       Thread.sleep( 1/100);

   }
   catch(Exception c){
   
   c.printStackTrace();
   }
          
        
        }}
   public static class buffer {
    private static final int CAPACITY = 5;  
     private java.util.LinkedList<Integer> queue =
        new java.util.LinkedList<>();
        private static Lock lock = new ReentrantLock();
        private static Condition notEmpty = lock.newCondition();
        private static Condition notFull = lock.newCondition();    
       
   
  
   public buffer(){ }
   public void save(int value) {
            
           lock.lock();  
            try {
                while ( queue.size() == CAPACITY) {
                    System.out.print(" Wait for notFull condition it is full");
                    
                    notFull.await();
                } 
                                         System.out.print(" value is "+value);
       

                 queue.offer(value);                 
                notEmpty.signalAll();  
            }
            catch (InterruptedException ex) {
                ex.printStackTrace();
            }
            finally {
                lock.unlock(); 
            }     
            
        }

        public int read() {
            
            
             int value = 0;
            lock.lock();  
            try {
                while ( queue.isEmpty()) {
                    System.out.println(" Wait for notEmpty condition:  it is empity");
                    notEmpty.await();
                }
                               value = queue.remove();
               
             }
            catch (InterruptedException ex) {
                ex.printStackTrace();
            }
            finally {
                lock.unlock();  
               
            }
            return value; 
}}}


Richard MacCutchan

Если это часть вашего вопроса, то, пожалуйста, добавьте его к фактическому вопросу и удалите это решение.