Czytanie zawartości pliku z wykorzystaniem wątków

0

Cześć, potrzebuję napisać jakiś program, w którym wątki będą czytać kolejne linie pliku tekstowego. Tylko tak aby jeden wątek nie przeczytał na raz więcej niż dwie linie no i oczywiście, żeby tekst był przeczytany od początku do końca bez omijania/powtarzania linii. Męczę się z tym już drugi dzień i o ile z ograniczeniem 2 linii nie mam problemu tak te wątki żyją jak chcą i nie umiem ich poskromić aby nie było przekłamań w odczytanym tekście. Czy mógłby ktoś pomóc i załączyć przykładowy kod, spełniający tę funkcję. Mam nadzieję, że potem pójdzie łatwiej z innymi zadaniami. Zaznaczam, ze interesują mnie wątki od Javy 1.5. Z góry dziękuję za pomoc !

0

masz np. 30 lini kodu... startujesz 3 wątki
pierwszy czyta tylko 1,4,7,10,13,16,19,22,25 i 28 linię
drugi 2,5,8,11,14,17,20,23,26,29
trzeci 3,6,9,12,15,18,21,24,27 i 30

możesz wyznaczyć na które linie wątek ma skoczyć i przeczytać po skończeniu obecnie czytanej

for(int i=0;i<40;i++)
if(i%5==0) Pierwsza opcja z pięciu
if(i%5==1) Druga opcja z pięciu

fakt faktem gówniany sposób bo niektóre wątki mogą być szybsze niż inne ale wątki mogą zwracać wszystko do głównego procesu
z informacją którą linię przeczytały i główny process sobie to poskłada w całość.

//Edit:
tego kodu w sumie tak myślę mógłbyś nie zrozumieć więc niech będzie tak:

if(i%5==0) Ty muj wontku czytasz pierwsze linie !

itd.

0

Przepraszam, pierwszy raz na forum :D a więc o to mój kod. Sypie błędami, że aż mi słabo. Dodatkowo wydaje mi się, że pewnie istnieje jakaś opcja aby wątek który już przeczytał swoje dwie linijki, mógł potem pracować znowu. Sorki za nazwy i ogólnie klasy ale to takie bardzooo ćwiczeniowe :D

public class Watek  implements  Runnable{
	
	public Watek() {}

	@Override
	public void run() {
		for(int i = 0; i < 2; i++)
			Main.readNextLine();
	}
}

import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Scanner;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class Main {

	private static Scanner read;
	private static ExecutorService exec;
	
	public static void readNextLine() {
		if(read.hasNextLine())
			System.out.println(read.nextLine());
		else
			exec.shutdown();
	}

	public static void main(String[] args) throws FileNotFoundException {
		File file = new File("file.txt");
		read = new Scanner(file);
		
		ArrayList<Watek> watki = new ArrayList<Watek>();
		exec = Executors.newFixedThreadPool(4);
		
		for(int i = 0; i< 12; i++)
			watki.add(new Watek());
		
		for(Watek w : watki)
			exec.execute(w);
		
	}

}
0

PROSZĘ POMÓŻCIE :D powiedzmy że mam 10 linii, już nawet nie ograniczam wątków, chce żeby tylko przeczytało w dobrej kolejności

public class Watek  implements  Runnable{
	
	public Watek() {
		
	}

	@Override
	public void run() {
			Main.readNextLine();
	}
	
}


import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Scanner;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class Main {

	private static Scanner read;
	private static ExecutorService exec;
	
	public static void readNextLine() {
		System.out.println(read.nextLine());
	}

	public static void main(String[] args) throws FileNotFoundException {
		File file = new File("file.txt");
		read = new Scanner(file);
		exec = Executors.newFixedThreadPool(3);
		
		Watek w1 = new Watek();
		Watek w2 = new Watek();
		Watek w3 = new Watek();
		
		for(int i = 0; i < 10; i++) {
			if(i%3 == 0)
				exec.execute(w1);
			if(i%3 == 1)
				exec.execute(w2);
			if(i%3 == 2)
				exec.execute(w3);
		}
		
	}

}

cały czas dostaję takie błędy

 Exception in thread "pool-1-thread-4" Exception in thread "pool-1-thread-11" java.lang.IndexOutOfBoundsException: start
	at java.base/java.util.regex.Matcher.region(Unknown Source)
	at java.base/java.util.Scanner.findPatternInBuffer(Unknown Source)
	at java.base/java.util.Scanner.findWithinHorizon(Unknown Source)
	at java.base/java.util.Scanner.nextLine(Unknown Source)
	at Main.readNextLine(Main.java:14)
	at Watek.run(Watek.java:10)
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
	at java.base/java.lang.Thread.run(Unknown Source)
java.lang.IndexOutOfBoundsException: start
	at java.base/java.util.regex.Matcher.region(Unknown Source)
	at java.base/java.util.Scanner.findPatternInBuffer(Unknown Source)
	at java.base/java.util.Scanner.findWithinHorizon(Unknown Source)
	at java.base/java.util.Scanner.nextLine(Unknown Source)
	at Main.readNextLine(Main.java:14)
	at Watek.run(Watek.java:10)
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
	at java.base/java.lang.Thread.run(Unknown Source)
0

Twoje wątki nie są w żaden sposób synchronizowane; odpalasz je i niech się dzieje wola nieba - to nie ma prawa zadziałać prawidłowo.

Wyobraź sobie, że masz przed sobą pięć osób i mają one czytać, jedna po drugiej, po jednym zdaniu ze wspólnej książki.
W jaki sposób można te osoby zsynchronizować? (protip: istnieją przynajmniej dwa podejścia)

0

ćwiczenie to mam przed tematem "synchronizacja wątków" więc musi być jakieś wyjście , bo tak to wystarczy dodać synchronized i wszystko hula :(

0
kwarka napisał(a):

ćwiczenie to mam przed tematem "synchronizacja wątków" więc musi być jakieś wyjście , bo tak to wystarczy dodać synchronized i wszystko hula :(

Nie wystarczy "synchronized", podobnie jak nie wystarczy "volatile" (szkoła falenicka i otwocka, obie błędne, a przynajmniej niepełne)

Patryk27 napisał(a):

Twoje wątki nie są w żaden sposób synchronizowane; odpalasz je i niech się dzieje wola nieba - to nie ma prawa zadziałać prawidłowo.

Wyobraź sobie, że masz przed sobą pięć osób i mają one czytać, jedna po drugiej, po jednym zdaniu ze wspólnej książki.
W jaki sposób można te osoby zsynchronizować? (protip: istnieją przynajmniej dwa podejścia)

Nikt nie myśli o konkurowaniu wątków co do pozycji w pliku. Problem jest do rozwiązania, ale optymalnych rozwiązań to ja nie widzę. Wychodzi mi dość długa czasowo sekcja krytyczna.

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