Sobes.tech
Middle

Javaда эки жиптин ортосунда маалымат алмашууну кантип уюштурууга болот?

sobes.tech AI

AIден жооп

Javaда агымдар аралыгындагы маалымат алмашуу төмөнкү жолдор менен уюштурулушу мүмкүн:

  • Жалпы өзгөрмөлөр менен синхрондоштуруу: Токендер жалпы өзгөрмөлөрдү колдонуп, алардын кирүүсү synchronized ачкыч сөзү, блоктор (Lock java.util.concurrent.locksтен) же атомардык өзгөрмөлөр (Atomic java.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: Эки токенге объекттерди алмашууга мүмкүндүк берет, синхрондоштуруу чекитинде.

Конкреттүү ыкманы тандоо маселеге, талап кылынган синхрондоштуруу деңгээлине, иштөө ылдамдыгына жана ишке ашыруу татаалдыгына көз каранды.