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

    thread con ritorno true

    Salve dato l'esempio inventato che esprime un mio dubbio,mi potreste aiutare a impostare il programma in modo che:
    dati dei thread ricercatori che esaminano una risorsa (array) brioss ,vorrei che trovata la stringa " kinder " e ritornando true ,avviassero i thread prelevatori (dal main)...Non saprei come correggere il codice per fare cio

    codice:
    public class Ricercatore extends Thread{
    	private Brioss brioss;
    	private int inizio;
    	private int fine;
    	
    	public Ricercatore(Brioss b,int in,int fin) {
           brioss=b; 
            inizio=in;
            fine=fin;
    	}	
    	
    	public void run(){
          
    		try {
    			sleep(1000);
    			brioss.ricercaKinder(inizio, fine);
    		
    		} catch (InterruptedException e){
    			e.printStackTrace();
    		}
    	}	
    }
    
    
    public class Prelevatore extends Thread{
    	
    	private Brioss brioss;
    	private int inizio;
    	private int fine;
    	
    	public Prelevatore(Brioss b,int in,int fin) {
    	       brioss=b; 
    	        inizio=in;
    	        fine=fin;
    		}	
    	
    	public void run(){
    	      
    		try {
    			sleep(4000);
    			brioss.prelevaKinder(inizio, fine);
    		
    		} catch (InterruptedException e){
    			e.printStackTrace();
    		}
    	}
    }
    
    public class Brioss {
    
    	   String brioss[]= new String[8];
    	     private Lock lock= new ReentrantLock();
    	   
        public Brioss() {
    		for(int i=0 ; i< brioss.length ;i++){        	
    			brioss[0]="cereali";
    			brioss[1]="cereali";
    			brioss[2]="cereali";
    			brioss[3]="cereali";
    			brioss[4]="cereali";
    			brioss[5]="cereali";
    			brioss[6]="kinder";
    			brioss[7]="cereali";
    		}
    	}
    	
        public String[] getBrioss() {
    		return brioss;
    	}
        
        public boolean ricercaKinder(int inizio,int fine){
        	 lock.lock();  
     	        try{
     	                   while(inizio<fine){
     			    		  if( brioss[inizio]== "kinder"){
     			    	   	     System.out.println("SONO UN THREAD RICERCATORE-->>> E C'E' UNA KINDER !!!!!!!");
     			    			   return true;
     			    		  }
     			    	     inizio++;
     	                   }
     	                   
     	        }catch(Exception e){  } 
     		       finally{
     		          lock.unlock();
     		       }	
        	return false;
        }
    
        public void prelevaKinder(int inizio,int fine){
        	lock.lock();  
    	        try{
    	                   while(inizio<fine){
    			    		  if( brioss[inizio]== "kinder"){
                                 brioss[inizio]="O";
    			    		  }
    			    	     inizio++;
    	                   }
    	                   
    	        }catch(Exception e){  } 
    		       finally{
    		          lock.unlock();
    		       }	
        }
    }
    
    
       
    public class MainBrioss {
    	static    Brioss B= new Brioss();
    	
    	    public   boolean AvviaRicercatori(){
    
    			int k=4;
    			int inizio= 0;
    			int dim = B.getBrioss().length;
    			int incr= dim/4;
    			int fine= incr;
    			Ricercatore   ricercatori[] = new Ricercatore[k];
    			
    			for(int j=0 ; j<ricercatori.length ; j++){
    		  	    ricercatori[j]= new Ricercatore(B,inizio, fine);
    			      ricercatori[j].start();
    				   inizio=fine;
    	  			     fine= fine+incr;
    			}   
    		/////????????????????????????
    		   
    	   }
    	   
    	  public  void AvviaPrelevatori(){
    		   int k=4;
    			int inizio= 0;
    			int dim = B.getBrioss().length;
    			int incr= dim/4;
    			int fine= incr;
    			Prelevatore   prelevatori[] = new Prelevatore[k];
    			
    			for(int j=0 ; j<prelevatori.length ; j++){
    		  	    prelevatori[j]= new Prelevatore(B,inizio, fine);
    			      prelevatori[j].start();
    				   inizio=fine;
    	  			     fine= fine+incr;
    			}
    	   }
    	  	   
    	   public static void main(String[] args) {
    		MainBrioss mb= new MainBrioss();
    		
    		if(mb.AvviaRicercatori())
    			mb.AvviaPrelevatori();
    
    	}
    
    }

  2. #2
    Potresti usare dei pool di thread con l'ExecutorService.

    L'ExecutorService accetta degli oggetti Callable che sono dei task che restituiscono un valore (a differenza dei Runnable) e li esegue contemporaneamente con i thread. Leggi un po' qui.

    Per ricercaKinder, al posto di usare un Lock, puoi usare il modificatore synchronized.
    lolide
    Java Programmer

    Informati

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.