Problem z niezakonczonym watkiem

Problem z niezakonczonym watkiem
wojtekf
  • Rejestracja:ponad 14 lat
  • Ostatnio:około 11 lat
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:

Kopiuj
 
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

edytowany 1x, ostatnio: wojtekf
KO
  • Rejestracja:ponad 13 lat
  • Ostatnio:około 13 lat
  • Postów:36
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.

edytowany 3x, ostatnio: kordirko
wojtekf
  • Rejestracja:ponad 14 lat
  • Ostatnio:około 11 lat
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

edytowany 1x, ostatnio: wojtekf
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)