using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Threading; /* * Esercizio 4: Combinazione di Concetti (Manager e Operaio) * Obiettivo: Simulare uno scenario più complesso in cui un thread "manager" monitora un thread "operaio". * Richieste: * 1. Creare un thread operaio (in foreground) che simuli un lavoro di 10 secondi. * 2. Creare un thread supervisore (in background) che, ogni 2 secondi, controlli lo stato del thread operaio e stampi un messaggio a console, come: `"[Supervisore]: Lo stato dell'operaio è: Running"`. * 3. Il thread principale (`Main`) ha il ruolo di "manager": * - Avvia sia il thread operaio che quello supervisore. * - Attende la terminazione solo del thread operaio usando `Join()`. * - Una volta che l'operaio ha finito, il `Main` stampa un messaggio finale ("L'operaio ha finito, il manager chiude la giornata.") e termina. * 4. Spiega perchè il thread supervisore si arresta automaticamente senza bisogno di un `Join()` specifico. */ namespace CompitoThread4 { class Program { static void Main(string[] args) { Thread operaio = new Thread(Opera); Thread supervisore = new Thread(Supervisiona); supervisore.IsBackground = true; operaio.Start(); supervisore.Start(operaio); operaio.Join(); // Non serve fare join sul supervisore, è in background quindi termina insieme al main. Console.WriteLine("L'operaio ha finito, il manager chiude la giornata."); } static void Opera() { Thread.Sleep(10000); } static void Supervisiona(object x) { if (!(x is Thread)) return; while (true) { Console.WriteLine("[Supervisore]: Lo stato dell'operaio è: {0}", (x as Thread).ThreadState); Thread.Sleep(2000); } } } }