• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Wątki od 1.5

Object Storage Arubacloud
0 głosów
437 wizyt
pytanie zadane 14 października 2018 w Java przez kwarek Nowicjusz (180 p.)
zmienione kategorie 14 października 2018 przez draghan

Hej potrzebuję czytać plik za pomocą wątków, mój kod jednak sprawia, że linie są ze sobą pomieszane. Czy ktoś byłby w stanie mi pomóc? W pliku jest 10 linii.

import java.util.ArrayList;
import java.util.Scanner;

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

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

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

public class Main {
    
    private static Queue<String> tekst;
    
    public static void metoda() {
        System.out.println(tekst.poll());
    }

    public static void main(String[] args) throws FileNotFoundException {
        File file = new File("file.txt");
        Scanner read = new Scanner(file);
        ExecutorService exec = Executors.newFixedThreadPool(3);
        
        tekst = new ArrayBlockingQueue<>(10);
        
        for(int i = 0; read.hasNextLine(); i++)
            tekst.add(read.nextLine());
        
        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);
        }
        
    }

}

 

komentarz 14 października 2018 przez mbabane Szeryf (79,280 p.)
Co dokładnie ma być zrobione. Bo aktualnie Twoje wątki jedynie wyświetlają tekst na ekran, a plik jest wczytywany w mainie.

Jeśli chcesz zrobić tak, żeby np. 3 wątki na raz czytały z pliku i żeby zachowana była kolejność linii to trzeba będzie użyć jakiś synchronizatorów, bez tego nie jesteś w stanie zagwarantować, który wątek kolejno odczyta. Ponadto bez synchronizatorów może też dojść do sytuacji, że dwa wątki wczytują tę samą linię.

2 odpowiedzi

0 głosów
odpowiedź 14 października 2018 przez adrian17 Ekspert (344,860 p.)

Moja intuicja: nawet jeśli "po kolei" wyciągasz rzeczy z kolejki, nie ma gwarancji, że println() wywoła się w tej samej kolejności.

Możesz temu zapobiec np przez dodanie `synchronized` do metody:

public synchronized static void metoda() {

Oczywiście wtedy tracisz jakiekolwiek zyski z używania wątków, bo cały kod w wątkach wykonuje się "pojedynczo".

(1.5?)

komentarz 14 października 2018 przez kwarek Nowicjusz (180 p.)
1.5 chodziło o wersję javy, czyli z tego co rozumiem to żeby odczytać coś bez powtórzeń musi być synchronizacja ? jeszcze takie pytanie załóżmy, że aplikacja jest ankietą, odpowiedzi są przechowywane w bazie danych, chcemy je odczytać aby zrobić jakieś wykresy statystyki. Kolejność odczytywania nie jest ważna, ważne żeby nic się nie powtórzyło ani nie zostało pominięte, w takiej sytuacji też trzeba użyć synchronizacji według mnie,ale skoro mówisz że traci się wtedy zyski używania wątków to o co chodzi? bo przeczytałam gdzieś w internecie, że odczyt z bazy dużych plików to jak najbardziej wątki do tego. Jak to zrobić efektywnie ?
komentarz 14 października 2018 przez adrian17 Ekspert (344,860 p.)

czyli z tego co rozumiem to żeby odczytać coś bez powtórzeń musi być synchronizacja?

Żeby metody nie przerwało w trakcie wykonanie na innym wątku innej metody będącej w stanie zmienić wynik, trzeba synchronizować. Nie wiem co masz na myśli z "powtórzeniami".

1.5 chodziło o wersję javy

Tylko zaznaczę, że 1.5 nie ma wsparcia od 10 lat, a teraz mamy Javę 11

0 głosów
odpowiedź 14 października 2018 przez kwarek Nowicjusz (180 p.)
Chwilę się zastanawiałam nad tym, synchronized pomaga, ale skoro to nie jest najlepsze rozwiązanie to czy istnieje inny sposób? Dokładne polecenie -> "Napisz aplikację, w której kilka wątków ma dostęp do jednego wspólnego pliku tekstowego. Zadaniem wątków jest odczyt kolejnych linii pliku, ale w ten sposób, aby jeden wątek nie pobrał więcej niż dwie linie tekstu naraz i aby pobrana linia nie powtarzała się - wątek nie może pobrać tej samej linii.
Działanie wątków można przerwać przez naciśnięcie klawisza 'k', a liczba wątków podawana jest jako argument wywołania programu.". PS chwilowo testowałam tylko sam odczyt bo z przerwaniem czy ilością, raczej nie będzie problemu.
komentarz 14 października 2018 przez mbabane Szeryf (79,280 p.)
Musisz skorzystać z jakiś synchronizatorów np. Semaphore, albo Lock.
komentarz 14 października 2018 przez adrian17 Ekspert (344,860 p.)
(`synchronized` też działa)
komentarz 14 października 2018 przez mbabane Szeryf (79,280 p.)
No tak, zgadza się powinno wystarczyć.

Podobne pytania

0 głosów
1 odpowiedź 237 wizyt
pytanie zadane 28 września 2018 w Sprzęt komputerowy przez MrxCI Dyskutant (8,260 p.)
0 głosów
1 odpowiedź 711 wizyt
0 głosów
1 odpowiedź 330 wizyt
pytanie zadane 15 kwietnia 2019 w Java przez mn130496 Gaduła (3,530 p.)

92,555 zapytań

141,403 odpowiedzi

319,555 komentarzy

61,940 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...