Nella programmazione e nell’ingegneria dei computer, un oggetto attivo è un tipo di modello di progettazione che può essere utilizzato per garantire che alcuni servizi siano sempre disponibili in un sistema multi-thread o simultaneo. Un oggetto attivo è un oggetto che implementa un meccanismo in modo da poter ricevere ed elaborare input da oggetti esterni senza costringere gli oggetti esterni ad attendere il completamento dell’esecuzione. Questo meccanismo consente inoltre a molti oggetti che potrebbero essere tutti in esecuzione contemporaneamente di utilizzare oggetti attivi senza la possibilità di lunghi tempi di blocco in cui i processi concorrenti devono fermarsi e attendere l’accesso. Ciò si ottiene il più delle volte avvolgendo gli oggetti attivi in un’interfaccia accessibile pubblicamente, chiamata proxy, e quindi implementando un tipo di sistema di coda all’interno degli oggetti in modo che i messaggi vengano archiviati per l’elaborazione successiva. Questo crea un modello di progettazione in cui gli oggetti inviano messaggi agli oggetti attivi e quindi continuano la loro elaborazione fino a quando l’oggetto attivo elabora il messaggio e successivamente informa gli oggetti chiamanti dei risultati in modo che possano aggiornare i propri stati di conseguenza.
Al di fuori di un modello di progettazione di oggetti attivi, un oggetto normale potrebbe essere chiamato oggetto passivo. In un semplice esempio di programma, un oggetto passivo potrebbe agire come un server di chat relay, in cui gli oggetti remoti contattano l’oggetto passivo per trasmettere un messaggio a tutti gli altri sul server. Ogni volta che l’oggetto server passivo riceve un messaggio di chat da un oggetto remoto, deve gestire immediatamente la richiesta e quindi inviare immediatamente l’output, il tutto mentre l’oggetto remoto interrompe la propria esecuzione fino al termine del processo, un effetto noto come blocco. La creazione di thread diversi all’interno del programma può risolvere il problema del blocco dell’esecuzione, ma poi avvia problemi con la sincronizzazione.
In un modello di progettazione di oggetti attivi, lo stesso oggetto server nell’esempio precedente verrebbe eseguito nel proprio thread separato dagli altri oggetti. Inoltre sarebbe racchiuso in un tipo di interfaccia noto come proxy che è anche in esecuzione in un thread separato, a volte il thread di esecuzione del programma principale. Quando un oggetto remoto vuole che l’oggetto server invii un messaggio di chat, contatta l’oggetto proxy, gli passa tutte le informazioni richieste e poi ritorna al suo normale stato di esecuzione invece di aspettare.
L’interfaccia proxy quindi converte le informazioni dall’oggetto remoto in un messaggio che passa a una coda per l’elaborazione dell’oggetto attivo. A questo punto, sia l’interfaccia proxy che l’oggetto remoto sono liberi di continuare l’esecuzione e non vengono bloccati. Nel frattempo, l’oggetto attivo lavora per mantenere la coda vuota, elaborando ogni messaggio in arrivo. Se l’oggetto chiamante richiede che alcune informazioni vengano restituite dall’oggetto attivo, è possibile utilizzare una struttura di callback per informare l’oggetto remoto di eventuali cambiamenti di stato.