Java wątki, ExecutorService

Java wątki, ExecutorService
macias_98
  • Rejestracja:prawie 8 lat
  • Ostatnio:9 miesięcy
  • Postów:19
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

Kopiuj

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

Kopiuj
ExecutorService specialService = Executors.newFixedThreadPool(2);


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

jarekr000000
  • Rejestracja:ponad 8 lat
  • Ostatnio:9 minut
  • Lokalizacja:U krasnoludów - pod górą
  • Postów:4707
1

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
macias_98
a da rade zrobić jakoś pętle foreach żeby włączało się dla każdego wątku wolnego w executorze?
jarekr000000
@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ć.
macias_98
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
jarekr000000
@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ąć.
macias_98
  • Rejestracja:prawie 8 lat
  • Ostatnio:9 miesięcy
  • Postów:19
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

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.