Как заставить работать синхронизацию 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 )[^].