Wątki i pliki co jest

0

Witam, otóż napisałem sobie program, który przy użyciu wątków z czytuje ilość linii w plikach i zapisuje je do ArrayBlockingQueue i później ma je wyświetlać w konsoli nie wiem dlaczego zadziałał mi tylko raz a teraz tak jak by wcale nie wykonywał się foreach do przeglądania kolejki. Może ktoś zerknąć na kod. Byłbym wdzięczny.

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.concurrent.BlockingQueue;

public class Kolekcja extends Thread{

private BlockingQueue<Integer> queue;
private FileReader file;
private String line;
private int ile = 0;

public Kolekcja(FileReader file, BlockingQueue<Integer> queue){
	this.file = file;
	this.queue = queue;
}

public void run() {
	try {
		BufferedReader in = new BufferedReader(file);
		while((line = in.readLine()) != null){
			ile++;
		}
		queue.offer(ile);
	} catch (IOException e) {
	}
	
}

}

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;

public class Main {
public static void main(String[] arg) throws FileNotFoundException{

	BlockingQueue<Integer> queue = new ArrayBlockingQueue<Integer>(3);
	
	FileReader file = new FileReader("D:/PlikiJava/test.txt");
	FileReader file2 = new FileReader("D:/PlikiJava/test2.txt");
	FileReader file3 = new FileReader("D:/PlikiJava/test3.txt");
	
	Kolekcja k1 = new Kolekcja(file, queue);
	Kolekcja k2 = new Kolekcja(file2, queue);
	Kolekcja k3 = new Kolekcja(file3, queue);

	k1.start();
	k2.start();
	k3.start();
	
	for(Integer wartosc : queue){
		System.out.println("Ilosc linii w pliku: " + wartosc);
	}
}

}

1

Widzę, że można liczyć na pomoc na tym forum.

4

Szkoda słów do tego kodu. Jakbyś nie zostawił pustego catcha to pewnie wiedziałbyś co jest nie tak... Ale do tego musiałbyś używać mózgu i rozumieć co masz w kodzie.

0

Gdybyś prześledził kod to byś zauważył, że klasa została poprawiona. Do osobnika który używa mózgu i rozumie zawsze co ma napisane to co byś radził?? Nie każdy urodził się od razu alfa i omega jak co niektorzy tu na forum.

0

Wrzuciłem sobie w catch'u e.printStackTrace(); i wyjątku jak nie było tak nie ma.

0

tylko jak wrzuce sobie do run() np. syso( ktory wyswietla kolekcje to mi ja wyswietla z zawartoscia) i wyjatku nie mam

0

A kto tu coś mówił o jakimś syso? Użyj debugera.

0

Zanim te twoje wątki rozpoczną pracę ty od razu wypisujesz zawartość kolejki, poczkej aż się wątki skończą, przed foreach wstaw np:

while ( k1.isAlive() || k2.isAlive() || k3.isAlive() );

powinno pomóc.

0

Dziękuje bardzo kult pomogło. Naprawdę dzięki. Niestety nasz wykładowca praktycznie nie tłumaczy nic i musimy do wszystkiego sami dochodzić. A powiedz w czym miał by mi pomóc Debbuger, szczerze to nigdy go nie używałem??

0

Debugger przede wszystkim wyświetla, w której linii kodu i jakiej klasy znajduje się aktualnie program, oraz jakie są wartości zmiennych. Wszystko to dzieje się w trakcie uruchamiania programu.

0

Ta odpowiedz @kult dziala ale jest srednia - tam jest niepotrzebny busy-wait w 4 watku (main), i aplikacja robi bez opamiętania w tym watku na maksa podczas czekania na reszte. Do tego lepsze sa inne sposoby, jak np. CountDownLatch

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