Middle
Ինչպե՞ս կարելի է կազմակերպել տվյալների փոխանակումը երկու հոսքերի միջև Java-ում։
sobes.tech AI
Պատասխան AI-ից
Դատարկ տվյալների փոխանակումը Java- ում կարող է կազմակերպվել հետևյալ եղանակներով:
- Համատեղ փոփոխականներ սինխրոնիզացիայով: Թողարկումները օգտագործում են ընդհանուր փոփոխականներ, որոնց մուտքը սինխրոնիզացվում է
synchronizedբանալի բառով, արգելափակոցներով (Lockjava.util.concurrent.locks-ից) կամ ատոմային փոփոխականներով (Atomicjava.util.concurrent.atomic-ից): - Տվյալների կոնվեյերներ (Piped Streams): Կապակցված մուտք/արտահոսքեր (
PipedInputStreamևPipedOutputStream) թույլ են տալիս մեկ հոսքին գրանցել տվյալներ, իսկ մյուսը՝ կարդալ:// Piped Streams-ների օգտագործում փորձեք { PipedOutputStream pout = նոր PipedOutputStream(); PipedInputStream pin = նոր PipedInputStream(pout); // Հոսք 1: գրանցում նոր Թել (() -> { փորձեք { pout.write("Բարև, հոսք 1-ից".getBytes()); pout.close(); } բռնելով (Exception e) { e.printStackTrace(); } }).start(); // Հոսք 2: կարդալ նոր Թել (() -> { փորձեք { int data; մինչ ((data = pin.read()) != -1) { System.out.print((char) data); } pin.close(); } բռնելով (Exception e) { e.printStackTrace(); } }).start(); } բռնելով (Exception e) { e.printStackTrace(); } - Հոսքեր (Queues): Օգտագործելով հոսքային անվտանգ հավաքածուներ, ինչպիսիք են
BlockingQueue(օրինակ,ArrayBlockingQueue,LinkedBlockingQueue), թույլ է տալիս մեկ հոսքին տեղադրել տարրեր հերթում, իսկ մյուսը՝ հանել:ներմուծում java.util.concurrent.BlockingQueue; ներմուծում java.util.concurrent.LinkedBlockingQueue; // Օգտագործում BlockingQueue BlockingQueue<String> queue = նոր LinkedBlockingQueue<>(); // Արտադրող նոր Թել (() -> { փորձեք { queue.put("Հաղորդագրություն 1"); queue.put("Հաղորդագրություն 2"); } բռնելով (InterruptedException e) { Thread.currentThread().interrupt(); } }).start(); // Կառավարող նոր Թել (() -> { փորձեք { System.out.println(queue.take()); System.out.println(queue.take()); } բռնելով (InterruptedException e) { Thread.currentThread().interrupt(); } }).start(); wait(),notify(),notifyAll(): Օգտագործվում են հոսքերի սինխրոնիզացման համար օբյեկտի մոնիտորների վրա: Մեկ հոսք կանչում էwait()՝ սպասելու պայմանին, մյուսը՝notify()կամnotifyAll()՝ սպասող հոսքերին տեղեկացնելու պայմանի փոփոխության մասին:// wait/notify օգտագործում դաս `Data` { մասնավոր String message; մասնավոր boolean empty = true; հանրային սինխրոնիզացված String read() { մինչ (empty) { փորձեք { wait(); // սպասում տվյալների } բռնելով (InterruptedException e) { Thread.currentThread().interrupt(); } } empty = true; notifyAll(); // տեղեկացնել հնարավոր գրանցման մասին վերադարձնել message; } հանրային սինխրոնիզացված void write(String message) { մինչ (!empty) { փորձեք { wait(); // սպասում նախորդ տվյալների ընթերցմանը } բռնելով (InterruptedException e) { Thread.currentThread().interrupt(); } } empty = false; այս.message = message; notifyAll(); // տեղեկացնել նոր տվյալների մասին } }CompletableFuture: Позволяет создавать асинхронные вычисления и объединять их результаты, обеспечивая обмен данными через возвращаемые значения и обработчики завершения.Exchanger: Позволяет двум потокам обменяться объектами в точке синхронизации.
Выбор конкретного метода зависит от специфики задачи, требуемого уровня синхронизации, производительности и сложности реализации.