Come far interagire tra loro due thread senza interrompere l'esecuzione del thread?

2

Potrebbe sembrare simile ad alcune delle altre domande, ma non riguarda l'attesa o la notifica.

Ho due thread che fanno due cose diverse
Il primo forma un processo in background e cambia comportamento quando riceve un input dall'altro thread che interagisce con l'utente.

    
posta Tanmay Kulkarni 14.07.2016 - 07:33
fonte

3 risposte

1

C'è un modo semplice per farlo: si imposta un oggetto con i dati sincronizzati e lo si condivide tra i thread. Puoi quindi scrivere i dati o controllarli da ciascun thread.

Quindi, avresti un'istanza di una classe simile a questa:

public class Shared {
    private boolean signalSent = false;

    public synchronized boolean isSignalSent(){
        return this.signalSent;
    }

    public synchronized void setSignalSent(boolean signal){
       this.signalSent = signal;  
    }
}

Puoi prendere in considerazione, se il segnale può essere nuovamente inviato, avere un metodo che legge e reimposta il valore.

In ogni caso, l'istanza di quella classe dovrebbe essere passata ad entrambi i thread, e sarà in grado di fare qualcosa di simile

if(!shared.isSignalSent()){
    // behave a certain way
} else {
    // behave another way
}
    
risposta data 14.07.2016 - 14:14
fonte
0

Se questo è Java, per prima cosa dai un'occhiata lunga a java.util.concurrent. Cercare di reinventare ciò che è stato già risolto crea così tanti problemi sottili. Sembra semplice, ma è incredibilmente difficile farlo correttamente.

Stai attento a pensare a quello che stai facendo. Sembra che tu stia chiedendo un thread per produrre dati e l'altro thread per consumare i dati. Non vuoi bloccare, quindi non hai altra scelta che fare il secondo thread ripetutamente. Ci sono tutti i tipi di modelli di design stabiliti per questo. Chiediti: (1) il primo thread produce un "evento" booleano (come "è successo"); (2) l'evento deve essere ripristinato e si ripresenta; (3) combinerai l'evento con i dati (come un booleano più una stringa); e così via. Ognuna di queste considerazioni aggiunge complessità per la sincronizzazione tra i thread.

Un difetto comune per (3) sopra, è un metodo o blocco mutex sincronizzato per chiedere "ci sono dati", quindi sbloccare, quindi il secondo thread pensa che ora desideri i dati e chiede "dammi quei dati". Tra "ci sono dati" e "dammi quei dati", il primo thread può reimpostare lo stato su nessun evento presente e reimpostare i dati su nulla. Il secondo thread richiede ora qualcosa che non esiste.

Piuttosto che dare la caccia a tutte queste interazioni sottili, cerca di riutilizzare un modello di progettazione e utilizzare un'utilità concorrente consolidata.

    
risposta data 13.08.2016 - 17:23
fonte
-2

Penso che puoi farlo usando il metodo comune in entrambi i thread,

ad esempio

1 thread può ricevere l'input dall'utente e processarlo con successo  elaborato rispetto all'aggiornamento del metodo comune e

2 thread controlla continuamente il metodo comune se è aggiornato o meno

se è aggiornato di quanto non avvenga.

    
risposta data 14.07.2016 - 08:35
fonte

Leggi altre domande sui tag