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 = чын; жалпы синхрондуу String окуу() { чейин (empty) { аракет кылуу { wait(); // маалымат күтүп жатабыз } кармап (InterruptedException e) { Thread.currentThread().interrupt(); } } empty = чын; notifyAll(); // жазуу мүмкүнчүлүгүн билдирүү кайтаруу message; } жалпы синхрондуу void жазуу(String message) { чейин (!empty) { аракет кылуу { wait(); // алдын ала окуганга чейин күтүп жатабыз } кармап (InterruptedException e) { Thread.currentThread().interrupt(); } } empty = чын; this.message = message; notifyAll(); // жаңы маалымат бар экенин билдирүү } }CompletableFuture: Асимхрондуу эсептөөлөрдү түзүүгө жана алардын натыйжаларын бириктирүүгө мүмкүндүк берет, маалымат алмашууну кайтарылган маанилер жана аяктоо иштетүүчүлөр аркылуу камсыз кылат.Exchanger: Эки токенге объекттерди алмашууга мүмкүндүк берет, синхрондоштуруу чекитинде.
Конкреттүү ыкманы тандоо маселеге, талап кылынган синхрондоштуруу деңгээлине, иштөө ылдамдыгына жана ишке ашыруу татаалдыгына көз каранды.