Problem z niezakonczonym watkiem

0

siema,

W mojej aplikacji jest przykladowo 500 uruchomionych watkow i one zliczaja ilosc wystapien slowa w roznych plikach. W pewnym momencie ktorys z nich sie zawiesza i nie wiem jak go zabic, albo cos, bo przez to nie moge dokonczyc obliczen. Czy mozna gdzies ustawic, ze jesli watek nie zakonczy sie w jakims czasie, to zeby sam sie skonczyl?

Wkleje kod, zeby mozna rzucic okiem:

 
public class BlockingQueue2 {

	 public static void main(String[] args) throws InterruptedException
	   {
	      Scanner in = new Scanner(System.in);
	      System.out.print("Podaj adres strony: ");
	      String directory = in.nextLine();
	      System.out.print("Podaj słowo kluczowe: ");
	      String keyword = in.nextLine();
	      System.out.print("Podaj głębokość szukania: ");
	      String depthString = in.nextLine();
	      int depth = Integer.parseInt(depthString);

	      final int FILE_QUEUE_SIZE = 10000;
	      final int SEARCH_THREADS = 500;

	      BlockingQueue<URL> queue = new ArrayBlockingQueue<URL>(FILE_QUEUE_SIZE);
	      AtomicInteger sum = new AtomicInteger();

	      CountDownLatch latch = new CountDownLatch(queue.size());
	      
	      for (int i = 1; i <= SEARCH_THREADS; i++)
				new Thread(new SearchTask(queue, keyword, sum, latch)).start();
	      
	      try {
	            // Important: waits for all workers to finish.
	            latch.await();
	        } catch (InterruptedException e) {
	        }
	      
	      System.out.println("    Sum: " + sum.get());
	      
	   }
}

class SearchTask implements Runnable
{

   public SearchTask(BlockingQueue<URL> queue, String keyword, AtomicInteger sum, CountDownLatch latch) throws InterruptedException
   {
      this.queue = queue;
      this.keyword = keyword;
      this.sum = sum;
      this.latch = latch;
   }

   public void run() 
   {
	   while (!queue.isEmpty())
	 {
		System.out.println(queue.size());
	    URL url = queue.poll();
			search(url);
	 }
   }

   public void search(URL url)  
   {
		try {
			out = new BufferedWriter(new FileWriter("content" + Thread.currentThread().getId() + ".xml"));
		
	   buffReader = new BufferedReader(new InputStreamReader(url.openStream()));
	   while ((inputLine = buffReader.readLine()) != null) {
		   out.write(inputLine + '\n'); 
	   }
	   out.close();
	   charArray = keyword.toCharArray();
	   
	   fstream = new FileInputStream("content" + Thread.currentThread().getId() + ".xml");
	   in = new DataInputStream(fstream);
	   while ((n = in.read()) != -1) {
	    	c = (char)n;
	    	if (c == charArray[place]) {  
	    		place++;  
	    		if (place == charArray.length) {  
	              place = 0; 
	              countWords++;
	    		}  
	    	}  
	    	else place = 0;  
	    }
       sum.addAndGet(countWords);

       // This runnable is finished, so count down
       latch.countDown();
	   
	    in.close();
	    file = new File("content" + Thread.currentThread().getId() + ".xml");
	    file.delete();
		} catch (IOException e) {
		}
   }

   private final AtomicInteger sum;
   private final CountDownLatch latch;
   private FileInputStream fstream;
   private int n = 0;
   private char c;
   private DataInputStream in;
   private int place = 0; 
   private BufferedWriter out;
   private BufferedReader buffReader;
   private String inputLine;
   private char[] charArray;
   private BlockingQueue<URL> queue;
   private String keyword;
   private File file;
   private int countWords = 0;
}

czesc kodu usunalem, bo dzialala dobrze, a nie byla potrzebna

0

Pytanie - po co ci 500 wątków ?
Chyba że masz 500 procesorów na maszynie, albo choćby może 100, to OK.
Ale jak są tylko 4 procesory, to czy puszczenie 500 wątków spowoduje że się to obliczy 10 razy szybciej niż jak 10 wątków ?
Program czyta z z sieci URL-e i zapisujesz na dysku - czy przy 500 wątkach łącze zadziała szybcicej niż przy 10 wątkach ?
Czy dysk zapisze więcej danych w tym samym czasie z 500 procesów niż z 10-ciu ?

Jedno co jest pewne na 100% to to, że każdy wątek potrzebuje pamięci na stos i na stercie,
jak się puści 500 to potrzeba większego stosu i więcej miejsca na stercie niż przy 10-ciu wątkach.
No i potrzeba więcej czasu procesora na przełączanie się pomiędzy wątkami (który można by wykorzystać na obliczenia).

A teraz wracając do meritum - problem jest tutaj:
[code]
} catch (IOException e) {
}
[/code]
czyli: jak cokolwiek się wysypie (być może zabraknie któremuś pamięci, albo timeout w połączeniu, albo coś),
to program to olewa, nie zamyka żadnych plików ani nie robi latch.countDown();
Nawet brak śladu w logach.

0

no ok, faktycznie masz racje z tymi watkami, zmniejszylem do 10 i przeszlo, poza tym w catchu mialem latch.countDown(), ale wywalilem, bo myslalem, ze to nie dziala, teraz znow wrzucilem.

Jeszcze tylko zastanawiam mnie jedna rzecz. Przy wejsciu jeden poziom wglab onetu (czyli linki z glownej strony), kolejka zawierala 322 linki. Jako slowo kluczowe podalem "Dziewczyna w niebieskim swetrze" i dostalem 415 wynikow. Chyba za duzo.

ed. chociaz w sumie w tej kolejce moga byc takie linki, ktore w jakis sposob prowadza na strone glowna i przez to nabijaja sobie ciagle licznik, bo na samej glownej mamy podanego stringa 3 razy

1 użytkowników online, w tym zalogowanych: 0, gości: 1