En programación e ingeniería de computadoras, un objeto activo es un tipo de patrón de diseño que puede usarse para ayudar a garantizar que algún servicio esté siempre disponible en un sistema de múltiples subprocesos o concurrente. Un objeto activo es un objeto que implementa un mecanismo para que pueda recibir y procesar entradas de objetos externos sin forzar a los objetos externos a esperar a que se complete la ejecución. Este mecanismo también permite que muchos objetos que podrían estar ejecutándose simultáneamente utilicen objetos activos sin la posibilidad de tiempos de bloqueo prolongados en los que los procesos simultáneos deben detenerse y esperar el acceso. La mayoría de las veces, esto se logra envolviendo los objetos activos en una interfaz de acceso público, llamada proxy, y luego implementando un tipo de sistema de cola dentro de los objetos para que los mensajes se almacenen para su procesamiento posterior. Esto crea un patrón de diseño en el que los objetos envían mensajes a los objetos activos y luego continúan su procesamiento hasta que el objeto activo procesa el mensaje y luego informa a los objetos que llaman de los resultados para que puedan actualizar sus estados en consecuencia.
Fuera de un patrón de diseño de objeto activo, un objeto normal podría denominarse objeto pasivo. En un ejemplo de programa simple, un objeto pasivo podría estar actuando como un relé de servidor de chat, en el que los objetos remotos contactan al objeto pasivo para transmitir un mensaje a todos los demás en el servidor. Siempre que el objeto de servidor pasivo recibe un mensaje de chat de un objeto remoto, debe manejar la solicitud de inmediato y luego enviar la salida de inmediato, todo mientras el objeto remoto detiene su propia ejecución hasta que finaliza el proceso, un efecto conocido como bloqueo. La creación de diferentes subprocesos dentro del programa puede resolver el problema del bloqueo de ejecución, pero luego inicia problemas con la sincronización.
En un patrón de diseño de objeto activo, el mismo objeto de servidor en el ejemplo anterior se estaría ejecutando en su propio hilo separado de los otros objetos. También estaría envuelto en algún tipo de interfaz conocida como proxy que también se ejecuta en un hilo separado, a veces el hilo principal de ejecución del programa. Cuando un objeto remoto quiere que el objeto servidor envíe un mensaje de chat, se pone en contacto con el objeto proxy, le pasa toda la información requerida y luego regresa a su estado de ejecución normal en lugar de esperar.
La interfaz de proxy luego convierte la información del objeto remoto en un mensaje que pasa a una cola para que el objeto activo lo procese. En este punto, tanto la interfaz proxy como el objeto remoto pueden continuar ejecutándose y no están bloqueados. Mientras tanto, el objeto activo trabaja para mantener la cola vacía, procesando cada mensaje entrante. Si el objeto que llama requiere que el objeto activo devuelva alguna información, entonces se puede usar una estructura de devolución de llamada para informar al objeto remoto de cualquier cambio de estado.