Visualizzazione dei risultati da 1 a 4 su 4
  1. #1

    [JAVA] TimeToLive Thread

    Salve a tutti, ho un problema che non riesco a risolvere.
    Sto costruendo un gestionale su una videoteca per un progetto all'università, e ho un problema legato alla durata di un thread.

    Questo è il codice in soggetto, che parte alla pressione di un tasto nella mia form.

    codice:
    Thread t = new Thread() { 	// Su un nuovo thread cosi non blocco la finestra principale
      public void run() {
    	String Temp1 = FText.getText(); 	// Titolo da cercare
    	if(!Temp1.equals("")){ 		// Controllo sia inserito qualcosa
    	  String Url = "http://www.imdbapi.com/?t=" + Temp; // Indirizzo per la ricerca film
    	  try {
    		DatiFilm = new Film(ElabFilm.downloadFromUrl (new URL (Url), "Mozilla/5.0"));
    		StampaRic(DatiFilm); 	// Mostro il risultato della ricerca
    		Action.setEnabled(true); 	// Ora posso fare una immissione dati nel db
    	  } catch (MalformedURLException e1) {	// Se c'è qualche problema di url...
    		showMessage("Service unavailable.", "Error", JOptionPane.ERROR_MESSAGE);
    	  } catch (IOException e1) {	// ... o di lavoro con i dati...
    		showMessage("Service unavailable.", "Error", JOptionPane.ERROR_MESSAGE);
    	  }				
    	}					
    	try { 	// Sospendo questo thread con la sleep() e passo il controllo all'altro thread
    		sleep(5);
    	} catch (InterruptedException ex) {}
      }
    };
    t.start(); 	// Faccio partire il thread
    Praticamente, con questa parte del programma, l'utente ha la possibilità di cercare delle informazioni su un determinato film, che vengono scaricate dal sito Imdb.
    Quello che non riesco a fare è bloccare la ricerca nel caso il sito sia lento a rispondere.
    Diciamo, non voglio che il thread viva per più di 10 sec, perchè vuole dire che il sito è lento a rispondere, e voglio terminarlo.
    Avevo pensato a un timer, ma non ho idea di come usarlo a mio vantaggio.

  2. #2
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  3. #3
    Ti ringrazio molto!!
    Questo codice fa esattamente quello che cerco.. ora devo solo adattarlo!

    codice:
    import java.util.concurrent.*;
    
    public class Test {
        public static void main(String[] args) throws Exception {
            ExecutorService executor = Executors.newSingleThreadExecutor();
            Future<String> future = executor.submit(new Task());
    
            try {
                System.out.println("Iniziato..");
                System.out.println(future.get(3, TimeUnit.SECONDS)); // Tempo di vita della ricerca
                System.out.println("Finito in tempo!");
            } catch (TimeoutException e) {
                System.out.println("Terminato non in tempo!");
            }
    
            executor.shutdownNow();
        }
    }
    
    class Task implements Callable<String> {  // Codice con tempo massimo di esecuzione
        @Override
        public String call() throws Exception {
            Thread.sleep(400); // Just to demo a long running task of 4 seconds.
            return "Eseguito il codice!";
        }
    }

  4. #4
    Niente, eseguendo delle funzioni in altre classi, non mi si interrompe.
    O meglio, mi avverte che ci ha messo più tempo ma le funzioni continuano a lavorare lo stesso, chiaramente le ho richiamate nel codice con il Time To Live..

    Per capirci, se metto un tempo di vita di mezzo secondo, mi viene detto che non si è finito il lavoro in tempo, ma aspettando qualche secondo, poi mi viene caricata l'immagine e le informazioni dalla funzione comunque...

    codice:
    class Task implements Callable<String> {  // Codice con tempo massimo di esecuzione
    	@Override
    	public String call() throws Exception {
    		Thread.sleep(4000); // Qui lavoro, ipotizzo molto codice
    		String Temp1 = FText.getText(); 	// Titolo da cercare
    		if(!Temp1.equals("")){ 		// Controllo sia inserito qualcosa
    			String Temp = Temp1.replaceAll(" ", "+"); 	// Sostituisco gli spazi con il + per la ricerca
    			String Url = "http://www.imdbapi.com/?t=" + Temp; 	// Indirizzo per la ricerca film
    			try {
    				ImageIcon icon = new ImageIcon("Loading.gif"); 	// Icona di caricamento
    				Img.setIcon(icon);
    				// DatiFilm è di tipo Film, e il costruttore riceve un array di stringhe da 0 a 28 elaborato
    				DatiFilm = new Film(ElabFilm.downloadFromUrl (new URL (Url), "Mozilla/5.0")); 	// Popolo il film
    				StampaRic(DatiFilm); 	// Mostro il risultato della ricerca
    				Action.setEnabled(true); 	// Ora posso fare una immissione dati nel db e abilito il tasto
    			} catch (MalformedURLException e1) {	// Se c'è qualche problema di url...
    				ImageIcon icon = new ImageIcon("BaseFilm.jpg");
    				Img.setIcon(icon);
    				showMessage("The service is unavailable.", "HTTP Error 503.", JOptionPane.ERROR_MESSAGE);
    			} catch (IOException e1) {	// ... o di lavoro con i dati...
    				ImageIcon icon = new ImageIcon("BaseFilm.jpg");
    				Img.setIcon(icon);
    				showMessage("The service is unavailable.", "HTTP Error 503.", JOptionPane.ERROR_MESSAGE);
    			}											
    		}
    			return "Eseguito il codice!";
    	}
    }
    
    public void actionPerformed (ActionEvent e){ 	// ActionEvent Menu	
    	if (e.getSource() == Ric) { 	// Se Clicco la ricerca film
    		ExecutorService executor = Executors.newSingleThreadExecutor();
    	        Future<String> future = executor.submit(new Task());
    	        try {
    	            System.out.println("Iniziato..");
    	            System.out.println(future.get(1/2, TimeUnit.SECONDS)); // Tempo di vita del codice
    	            System.out.println("Finito in tempo!");
    	        } catch (TimeoutException | InterruptedException | ExecutionException e1) {
    	            System.out.println("Terminato non in tempo!");
    	        }
    	        executor.shutdownNow();
    	}
    }

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.