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);
            }
        }
    }
}
