Java: Finns det något sätt att lyssna av en vanlig array?

Permalänk

Java: Finns det något sätt att lyssna av en vanlig array?

Jag har två arrayer som skickas mellan en Android applikation och ett program i C på min dator.

private static int[] readBuffer; private static byte[] writeBuffer;

Där readBuffer och writeBuffer ständigt uppdateras via socketprogrammering hela tiden av en task.

Då vill jag ha en annan task som ständigt läser dessa arrayer när dem har uppdateras. Noter att dem är statiska arrayer och därmed kan bli åstadkommen från andra klasser enkelt.

Men hur ska jag göra så att något känner av "Aha! Nu har readBuffer och writeBuffer blivit läst in, dags att läsa dessa upp på skärmen"?

Permalänk
Medlem
Skrivet av heretic16:

Jag har två arrayer som skickas mellan en Android applikation och ett program i C på min dator.

private static int[] readBuffer; private static byte[] writeBuffer;

Där readBuffer och writeBuffer ständigt uppdateras via socketprogrammering hela tiden av en task.

Då vill jag ha en annan task som ständigt läser dessa arrayer när dem har uppdateras. Noter att dem är statiska arrayer och därmed kan bli åstadkommen från andra klasser enkelt.

Men hur ska jag göra så att något känner av "Aha! Nu har readBuffer och writeBuffer blivit läst in, dags att läsa dessa upp på skärmen"?

Vet inte hur man gör i Java specifikt. Några nyckelord du kan läsa på om är:

Mutex, vilket står för Mutual-Exclusion och används för att hantera synkronisering genom att en resurs bara kan användas av en tråd i taget i ett ögonblick, genom att man "låser" den för åtkomst när man vill använda den, och "låser upp" den när man är klar;

Semaphore. Semaforer är lika mutexer, men kan inte bara boolskt representera om en resurs är låst eller inte, utan kan mer som ett naturligt tal representera hur stor en resurs är eller hur många värden den har tillgänglig;

Channels. Kanaler är ett lite mer hög-nivå koncept som ofta resulterar i smidigare kod, men är lite mer specialiserade än mutexer. En kanal består av ett par av en sändare och en mottagare. Genom sändarobjektet kan man skicka data, och mottagarobjektet lyssnar på meddelanden av data.

Tasks/Futures/Promises är alla liknande koncept, och du verkar ju redan ha lite känn för tasks.

Visa signatur

Arbets- / Spelstation: Arch Linux - Ryzen 5 3600 - RX 7900 XT - 32G DDR4
Server: Arch Linux - Core i5-10400F - 16G DDR4

Permalänk
Medlem

Här är ett exempel på hur en kanal kan användas, i pseudokod:

// Example program to print integers read from socket in a gui, 100 at a time // Create a channel of a transmitter and a receiver var (tx, rx) = new Channel<int[]>(); Thread 1: var socket = ...; loop: var xs = new int[100](); for i in [0..100): var x = socket.readInt(); // Blocking operation xs[i] = x; tx.send(xs); Thread 2: var textBox = ...; loop: var xs = rx.receive(); // Blocking operation textBox.showInts(xs);

Visa signatur

Arbets- / Spelstation: Arch Linux - Ryzen 5 3600 - RX 7900 XT - 32G DDR4
Server: Arch Linux - Core i5-10400F - 16G DDR4

Permalänk
Medlem

Låter som att det är events du söker. Vet att jag använde guava för detta någon gång.

https://www.baeldung.com/guava-eventbus
https://github.com/google/guava/wiki/EventBusExplained

Visa signatur

| Ryzen 5800x | Asus prime x470 pro | Asus rtx 3080 tuf oc | Gskill 32gb 3,6ghz | aw3225qf |

Permalänk
Skrivet av Ragin Pig:

Låter som att det är events du söker. Vet att jag använde guava för detta någon gång.

https://www.baeldung.com/guava-eventbus
https://github.com/google/guava/wiki/EventBusExplained

Ja. Någon typ av lyssnare söker jag.

Permalänk

Nu kommer jag på en sak! För varje gång jag gör en kommunikation med socket så anropar jag ett statiskt fält från en annan klass när readBuffer och writeBuffer uppdateras, vilket sker i samma veva som socket

Vad tror ni om det? Bygla över ett statiskt fält till en annan klass?

Permalänk
Medlem

@heretic16: "Observer pattern" kan du använda dig av, en generell programmeringsmetod man använder sig av för att informera intressenter (läs klasser/program) om eventuella förändringar.

I.E googla "java observer pattern"

Permalänk
Skrivet av Overwatch:

@heretic16: "Observer pattern" kan du använda dig av, en generell programmeringsmetod man använder sig av för att informera intressenter (läs klasser/program) om eventuella förändringar.

I.E googla "java observer pattern"

Tackar så mycket för informationen. Jag tänkte först att jag skulle använda mig av Dependency Injection, men det var fel.

Bästa vore om jag kunde få tillgång till Dependency Injected:ade fält.

Permalänk

Nej. Det var fel metod, tyvärr.

Permalänk
Hedersmedlem
Skrivet av heretic16:

Nej. Det var fel metod, tyvärr.

Då har du beskrivit ditt behov fel. För Observer pattern stämmer väldigt bra med vad du beskrev.

https://sv.wikipedia.org/wiki/Observat%C3%B6r_(designm%C3%B6n...

Citat:

Observatör är ett designmönster där ett objekt håller i en lista över beroenden, som kallas "observatörer", och meddelar dem automatiskt när någonting ändras, vanligtvis genom att anropa en av deras metoder.

Skrivet av heretic16:

Men hur ska jag göra så att något känner av "Aha! Nu har readBuffer och writeBuffer blivit läst in, dags att läsa dessa upp på skärmen"?

Permalänk
Skrivet av Shimonu:

Då har du beskrivit ditt behov fel. För Observer pattern stämmer väldigt bra med vad du beskrev.

https://sv.wikipedia.org/wiki/Observat%C3%B6r_(designm%C3%B6n...

Japp. Jag har uppgett då fel. Det jag var behov utav är att jag måste komma åt fält från JavaFX.

Det jag har gjort nu är att jag använder mig av Scene scene objektet för att komma åt dom injektserade fälten.

Spinner<Double> spinner = (Spinner<Double>) scene.lookup("#sampleTimeSpinner"); System.out.println("hello " + spinner.getValue());