Может ли кто-нибудь помочь мне, почему еще условие не отображается через консоль для ожидания потока. если я использую метод future.get () - PullRequest
1 голос
/ 18 апреля 2020

здесь, в офисном экземпляре getsum () возвращает сумму из n числовых цифр, и только одному потоку разрешено завершать вычисления за один раз с периодом ожидания 1 секунда. В течение этого времени другой Поток будет пытаться заблокировать. Если Поток не получит блокировку, он печатает еще условие через консоль и повторяется в do-while l oop, пока не будет завершено

import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.ReentrantLock;

public class Office {
    private ReentrantLock lock = new ReentrantLock(true);

    public void login(String name) {
        System.out.println("Good Morning : " + name);
    }

    public long getSum(String name, long number) {
        long sum = 0;
        try {
            do {
                if (lock.tryLock(500, TimeUnit.MILLISECONDS)) {
                    for (int i = 1; i <= number; i++) {
                        sum = sum + i;
                        Thread.sleep(1000);
                    }
                    lock.unlock();
                    break;
                } else {
                    System.out
                            .println("waiting for lock : " + name + " " + Thread.currentThread() + " " + "is waiting");
                }
            } while (true);

        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return sum;
    }

    public void logout(String name) {
        System.out.println("Good night : " + name);
    }
}
import java.util.concurrent.Callable;

public class MyCallable implements Callable {
    private Office office;
    private String name;
    private long number;

    public MyCallable(Office office, String name, long number) {
        this.office = office;
        this.name = name;
        this.number = number;
    }

    @Override
    public Object call() throws Exception {
        office.login(name);
        long total = office.getSum(name, number);
        office.logout(name);
        return total + " " + name;
    }
}

Здесь future.get () , если мы используем, мы не можем получить оператор ожидания потока через консоль, и если мы не оператор ожидания успешно отображается через консоль. Мне немного любопытно, почему это происходит, так как get () показывает результат только тогда, когда Thread завершается и ждет, если необходимо, чтобы завершилось вычисление, а затем извлекает его результат. Как это может повлиять на оператор else в getSum экземпляра office

import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

public class Main {
    public static void main(String[] args) {
        long total = 0;
        String name = null;
        Office office = new Office();
        MyCallable myCallable[] = { new MyCallable(office, "Nik", 10), new MyCallable(office, "Dev", 20),
                new MyCallable(office, "push", 30), new MyCallable(office, "Sam", 40) };

        ExecutorService service = Executors.newFixedThreadPool(2);
        for (MyCallable callable : myCallable) {

            Future future = service.submit(callable);
            try {
                String result[] = future.get().toString().split(" ");
                total = Integer.parseInt((result[0]));
                name = result[1];
                System.out.println(name + " " + total);
            } catch (InterruptedException | ExecutionException e) {
                e.printStackTrace();
            }

        }
        service.shutdown();
    }
}

* Я получаю вывод без каких-либо ожидающих сообщений Thread else с использованием future.get () метод

 OUTPUT:
 Good Morning : Nik
 Good night : Nik
 Nik 55
 Good Morning : Dev
 Good night : Dev
 Dev 210
 Good Morning : push
 Good night : push
 push 465
 Good Morning : Sam
 Good night : Sam
 Sam 820

Here i'm expecting else statement also for waiting Threads but not getting that if i use future.get();

1 Ответ

0 голосов
/ 18 апреля 2020

Сначала необходимо отправить все фьючерсы, а только потом пытаться позвонить .get(). Вот ваш основной модифицированный метод:

    public static void main(String[] args) {
        long total = 0;
        String name = null;
        Office office = new Office();
        MyCallable myCallable[] = { 
                new MyCallable(office, "Nik", 10), 
                new MyCallable(office, "Dev", 20),
                new MyCallable(office, "push", 30), 
                new MyCallable(office, "Sam", 40) };

        ExecutorService service = Executors. newFixedThreadPool(2);
        List<Future> futures = new ArrayList<>();
        for (MyCallable callable : myCallable) {
            futures.add(service.submit(callable));
        }
        for (Future future : futures) {
            try {
                String result[] = future.get().toString().split(" ");
                total = Integer.parseInt((result[0]));
                name = result[1];
                System.out.println(name + " " + total);
            } catch (InterruptedException | ExecutionException e) {
                e.printStackTrace();
            }
        }
        service.shutdown();
    }

Это дает следующий вывод:

Good Morning : Dev
Good Morning : push
waiting for lock : Dev Thread[pool-1-thread-2,5,main] is waiting
waiting for lock : Dev Thread[pool-1-thread-2,5,main] is waiting
...