Member 14797538 Ответов: 1

Как заставить работать синхронизацию 2 потоков нужен кто-то, кто может решить вопрос редактирования моего кода ?


вы собираетесь использовать семафоры для синхронизации процессов. Поэтому вам предлагается разработать многопоточную программу для потребителей и производителей.
Предположим, что у нас есть поток (producer, назовем его producer_thread), считывающий данные (положительные целые числа) с клавиатуры, введенные пользователем для хранения в массиве (динамическом массиве). (Предположим, что массив может содержать все введенные числа без переполнения.)

Другой поток (consumer, назовем его consumer_thread) должен считывать данные из массива и записывать их в файл. Этот поток должен выполняться одновременно с производителем (producer_thread).
Ваша программа должна убедиться, что consumer_thread может считывать данные из массива только после того, как producer_thread сохранит новые данные. Оба потока остановятся, когда пользователь введет отрицательное число.


После этого другой поток (testing_thread) должен начать считывать данные массива, а также данные файла и отображать их на экране, чтобы проверить, правильно ли синхронизированы потребитель и производитель. Этот поток не должен синхронизироваться с другими потоками, он полезен для тестирования того, что поток потребителя синхронизирован с потоком продукта.

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

package multithreaded;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Scanner;
import java.util.concurrent.Semaphore;
import java.util.logging.Level;
import java.util.logging.Logger;



public class MultiThreaded {

    public static void main(String[] args) throws InterruptedException {
        
       Thread t1 =new Thread(new Runnable(){
           
        @Override
        public  void run(){
        try{
            producer_thread();
        }
        catch(InterruptedException e){
            e.printStackTrace();
        }
 
        }
        });
         Thread t2 =new Thread(new Runnable(){
        @Override
        public  void run(){
        try{ 
            consumer_thread();
        }
          catch (IOException ex) {   
                Logger.getLogger(MultiThreaded.class.getName()).log(Level.SEVERE, null, ex);
            }
        
        
        
        }
        });
         Thread t3 =new Thread(new Runnable(){
        @Override
        public void run(){
        try{ 
            testing_thread();
        }
          catch (IOException ex) {   
                Logger.getLogger(MultiThreaded.class.getName()).log(Level.SEVERE, null, ex);
            } catch (InterruptedException ex) {
                Logger.getLogger(MultiThreaded.class.getName()).log(Level.SEVERE, null, ex);
            }
        
        
        
        }
        });
       t1.start();
       t2.start();
       t3.start();
    }
    private static Semaphore sem =new Semaphore(1);

    private static ArrayList<Double> FromUser = new ArrayList<>();
    private static void producer_thread() throws InterruptedException{
     sem.acquire();
     Scanner input = new Scanner(System.in);
     System.out.print("Enter the numbers: ");
     Double s=input.nextDouble(); 
     while(s>=0)
     {
        FromUser.add(s);
         s=input.nextDouble(); 
     }
     sem.release();
     
      
    }
  private static void consumer_thread() throws IOException {
        try {
            sem.acquire();
        } catch (InterruptedException ex) {
            Logger.getLogger(MultiThreaded.class.getName()).log(Level.SEVERE, null, ex);
        }
            PrintWriter outputWriter = new PrintWriter("Em.txt");
            for (int i = 0; i <FromUser.size(); i++) {
                outputWriter.println(FromUser.get(i)+"");
            }
            
            outputWriter.close();
        sem.release();
        } 
private static void testing_thread() throws InterruptedException, FileNotFoundException{
    try {
            sem.acquire();
        } catch (InterruptedException ex) {
            Logger.getLogger(MultiThreaded.class.getName()).log(Level.SEVERE, null, ex);
        }
    
    System.out.println("the stored numbers in the ArrayList:"+FromUser);
    Scanner file=new Scanner(new File("Em.txt"));
     System.out.println("the stored numbers in the Text file:");
    while(file.hasNextLine()){
    String data=file.nextLine();
    System.out.println(data);
    }
   
    sem.release();

    }
     }

Richard MacCutchan

В чем же вопрос?

Richard MacCutchan

Вы уже опубликовали это выше. Повторение этого не объясняет, в чем заключается ваш вопрос.

Member 14797538

Человек, вот в чем вопрос !!

Richard MacCutchan

Да, мы знаем это, но мы понятия не имеем, почему вы разместили его здесь, так как вы уже написали код.

Member 14797538

поскольку мой код является note complete, я не знаю, как использовать семафор для синхронизации первого потока (производителя) со вторым потоком (потребителем).

Richard MacCutchan

Видеть Семафор (Java Platform SE 7 )[^].

1 Ответов

Рейтинг:
1

Patrice T

Цитата:
Как заставить 2 потока работать одновременно

Короткий ответ: потоки никогда не работают в одно и то же время, с одинаковой скоростью.
В принципе, на уровне процессора потоки никогда не работают одновременно, даже если выполняют именно эту работу. В алгоритме вы всегда будете иметь некоторые контрольные точки, где потоки должны будут синхронизироваться перед началом следующего шага.
Цитата:
вы собираетесь использовать семафоры для синхронизации процессов.

Семафоры - это способ взаимодействия потоков.

Я не использую нити, но принципы всегда одни и те же.