[Coding] [Java] Come terminare un thread in un preciso istante di tempo
  • In diretta da GamesVillage.it
    • News
    • -
    • In Evidenza
    • -
    • Recensioni
    • -
    • RetroGaming
    • -
    • Anteprime
    • -
    • Video
    • -
    • Cinema

Visualizzazione risultati da 1 a 7 di 7

Discussione: [Java] Come terminare un thread in un preciso istante di tempo

Cambio titolo
  1. #1
    Utente L'avatar di SerFrank
    Registrato il
    01-07
    Località
    Nel Mio Mondo
    Messaggi
    4.248

    [Java] Come terminare un thread in un preciso istante di tempo

    Ho il problema di terminare un thread entro un determinato periodo di tempo.
    Ad esempio:
    Ho un thread che esegue una mia operazione e scattati 5 secondi il thread deve essere interrotto e restituire in caso un risultato parziale.

    Come posso fare?
    VOI FATE LA CACCA....

    "Credo sia meglio rimpiangere qualcosa che si è fatto,
    che qualcosa che non si è
    fatto."

    Patrick Jane

  2. #2
    panzone
    Ospite
    Citazione SerFrank Visualizza Messaggio
    Ho il problema di terminare un thread entro un determinato periodo di tempo.
    Ad esempio:
    Ho un thread che esegue una mia operazione e scattati 5 secondi il thread deve essere interrotto e restituire in caso un risultato parziale.

    Come posso fare?
    Partiamo da tre premesse:

    1) Non aspettarti 5 secondi precisi, dipende da troppi fattori incontrollabili poiché esegui su una VM (non che su un pc classico sia più semplice discretizzare il tempo eh).
    2) Non uccidi un thread a meno che sei certo al 100% non lo riuserai. Piuttosto lo interrompi e gli fai una signal, ma continuare a spawnare thread sulla JVM è tipo una delle cose più lente ever.
    3) Fare multithreading usando tempi precisi è concettualmente sbagliato. Farlo in Java è persino peggio.

    Per rispondere alla domanda, ExecutorService + invokeAll ti permette di far partire una collection di Runnable e di farli ritornare o quando terminano l' esecuzione od al termine di un timeout, in base a quale delle due condizioni avviene prima.
    Ultima modifica di panzone; 4-02-2015 alle 14:36:27

  3. #3
    Utente L'avatar di SerFrank
    Registrato il
    01-07
    Località
    Nel Mio Mondo
    Messaggi
    4.248
    A me serve far partire una sola esecuzione di un thread(che in questo caso particolare mi calcola tramite un'alpha beta pruning con iterative depeening una mossa per un gioco), che deve bloccarsi nel giro di un millisecondo.
    Posso usare l'ExecutorService oppure mi basta una gestione ingegnosa dell'interruptedexception?
    VOI FATE LA CACCA....

    "Credo sia meglio rimpiangere qualcosa che si è fatto,
    che qualcosa che non si è
    fatto."

    Patrick Jane

  4. #4
    panzone
    Ospite
    Citazione SerFrank Visualizza Messaggio
    A me serve far partire una sola esecuzione di un thread(che in questo caso particolare mi calcola tramite un'alpha beta pruning con iterative depeening una mossa per un gioco), che deve bloccarsi nel giro di un millisecondo.
    Posso usare l'ExecutorService oppure mi basta una gestione ingegnosa dell'interruptedexception?
    Il fatto è che c' è un problema di fondo: un millisecondo rispetto a quando ? Un millisecondo di esecuzione (ExecutorService fa questo, pur se sei consapevole che non sarà mai un millisecondo preciso) ? Un millisecondo da quando decidi di spawnare il thread (e questo è impossibile per definizione di thread) ?

    interruptedexception non capisco come vorresti usarlo per una cosa del genere

  5. #5
    Utente L'avatar di SerFrank
    Registrato il
    01-07
    Località
    Nel Mio Mondo
    Messaggi
    4.248
    Ho un metodo che mi trova una mossa per un gioco. Questa mossa deve essere restituita entro un limite di tempo.
    Quindi abbiamo un gioco a turni. Quando il mio avversario mi da la mossa che ha fatto allora io inizio a calcolare il tempo e entro Xmillisecondi devo restituire a lui un'altra mossa. E così via.
    Il mio "problema" è appunto come gestire questa situazione di timeout
    VOI FATE LA CACCA....

    "Credo sia meglio rimpiangere qualcosa che si è fatto,
    che qualcosa che non si è
    fatto."

    Patrick Jane

  6. #6
    panzone
    Ospite
    Se proprio dobbiamo andare di multithreading farei un gioco di messaggi asincroni sinceramente: crei un thread con la funzione da eseguire ma lo metti in sleep. Quando deve iniziare gli fai una signal dal thread principale. Poi metti il thread principale in sleep x millisecondi ed al risveglio vedi se di la ti ha risposto. Se no, continui la nuova mossa e scarti il messaggio quando arriverà.

    Il problema di questo ragionamento è lo stesso problema che fai tu: come e per quanto i thread vengono eseguiti non è deterministico. Tu dici "faccio partire il thread ed aspetto x millisecondi per la risposta", il problema è che tu non sai quando quel thread verrà fatto partire (e no, notificarlo o spawnarlo NON garantisce che il thread parta immediatamente). Oltretutto, non hai modo di prevedere i context switch: se un thread è in esecuzione ma la macchina decide di fare un context switch a metà della funzione, facendolo tardare quando in realtà avrebbe risposto in tempo ?

    In altri termini: scordati tempi assoluti. L' unico modo che mi viene in mente è appunto un sistema di messaggi asincroni in cui droppi la risposta se arriva troppo tardi, ma anche li, potrebbe non esser colpa della funzione se tarda. Tuttavia immagino che una situazione come quella sopra sia ciò che tu voglia, visto che se il messaggio arriva troppo tardi ha perso del tutto valore.
    Ultima modifica di panzone; 4-02-2015 alle 17:23:51

  7. #7
    Utente L'avatar di SerFrank
    Registrato il
    01-07
    Località
    Nel Mio Mondo
    Messaggi
    4.248
    Ok quindi l'idea è quella di usare un ExecutorServices ma come?
    Non è che potresti farmi un esempio?

Regole di Scrittura

  • Tu non puoi inviare nuove discussioni
  • Tu non puoi inviare risposte
  • Tu non puoi inviare allegati
  • Tu non puoi modificare i tuoi messaggi
  •