Java wątki, ExecutorService

Odpowiedz Nowy wątek
2018-02-17 09:57

Rejestracja: 3 lata temu

Ostatnio: 1 tydzień temu

0

Chciałbym aby jednocześnie pracowały 2 wątki ze specialService wykonujące te samą funkcję jednak nie rozumiem czemu nie działa


main(){
ExecutorService specialService = Executors.newFixedThreadPool(2);

        specialService.submit(() -> {
            while (!isEndOfDayWork || anyTaskLeft) {
                Employee employee = removeFromQueue();
                if (employee != null) {
                    handleSpecialStatusPriorityClient(employee);
                    }}});
}

private void handleSpecialStatusPriorityClient(Employee employee){
        Client specialStatusClient = specialStatusClients.poll();
        handleTheQuestion(specialStatusClient, employee);

        employeesLock.lock();
        try{
            employees.add(employee);
        }finally {
            employeesLock.unlock();
        }
    }

    private void handleTheQuestion(Client handledClient, Employee employee){
        if(handledClient!=null) {
            final long time = handledClient.getQuestion().getAmountOfTimeToHandleQuestion();
            try {
                Thread.sleep(time * 1000);
                System.out.println(employee.getID() + " just handled "+ handledClient.getQuestion() + " task!");
            } catch (InterruptedException e) {
                System.out.println("Problem during thread sleeping");
            }
        }
    }

Problemem jest, że działa tylko 1 a w executorze utworzyłem 2.

Gdy rozbije na dwa tak jak niżej i dam takie same submity to jednak działa, więc pytanie jest moje czemu ta wersja u góry nie działa

ExecutorService specialService = Executors.newFixedThreadPool(2);

ExecutorService specialService1 = Executors.newFixedThreadPool(1);
ExecutorService specialService2 = Executors.newFixedThreadPool(1);

Pozostało 580 znaków

2018-02-17 10:04

Rejestracja: 3 lata temu

Ostatnio: 2 godziny temu

Lokalizacja: U krasnoludów - pod górą

A robiłeś 2 submity do tego executora?
Executor robi zadania. Wrzucane submitem. Każde wrzucone zadanie dostaje wątek z puli.


jeden i pół terabajta powinno wystarczyć każdemu
edytowany 3x, ostatnio: jarekr000000, 2018-02-17 10:06
a da rade zrobić jakoś pętle foreach żeby włączało się dla każdego wątku wolnego w executorze? - macias_98 2018-02-17 11:17
@macias_98: nie wiem co masz na myśli. Generalnie ExecutorService to nie wątki - to zadania, które gdzieś pod spodem są wykonywane na wątkach. Może Ty po prostu wątków potrzebujesz? Chociaż hint jest taki - zwykle tylko się wydaje, że potrzeba wątków. Napisz co chcesz uzyskać. - jarekr000000 2018-02-17 11:20
Mój program to symulator kolejki np. w usługach. Jest określona liczba stanowisk pracy(pracowników) i w zależności od liczby pracowników tyle ma wykonywanych takich samych zadań jednocześnie (obsługiwanie klientów, którzy są na bieżąco dodawani do kolejki). Chce aby ExecutorService najpierw stworzył pulę wątków tyle ilu jest pracowników ( i to robi u mnie), a potem, żeby przydzielił rozdzielał zadania każdemu pracownikowi (taki submit jak jest u góry). I teraz czy mam zrobić pętle for (int i=0; i< liczbaPracowników; i++){ submit... taki jak wyżej} czy jakiś foreach da rade - macias_98 2018-02-17 11:28
@macias_98: czyli robisz ExecutorService, z użyciem ExecutorService :-) - po prostu przekieruj metodę submit.. Executory dokładnie tak działają - mają kolejkę zadań i N równoczeńsie działających pracowników==wątków. Wrzucasz submit - to trafia do kolejki, aż jakiś wolny wątek się nim będzie mógł zająć. - jarekr000000 2018-02-17 11:30

Pozostało 580 znaków

2018-02-17 10:51

Rejestracja: 3 lata temu

Ostatnio: 1 tydzień temu

0

aaa czyli musze do każdego dawać submit, myślałem że jak mam service i daje submit a mam więcej wątków to submit zadziała jak jakieś submit all, a to dziekuje, teraz działa i sam executorService wydaje się być bardziej użytecny :D

Pozostało 580 znaków

Odpowiedz

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