+1 امتیاز
قبل در برنامه نویسی توسط (45 امتیاز)
ویرایش شده قبل توسط
در پکیج java.util.concurrent ، یک Interface به نام Future داریم که متدی به نام ()get داره.

استفاده از این متد ظاهرا concurrency رو از بین می بره. چرا؟!
قبل توسط (1.1هزار امتیاز)
منظورتون از متد get چیه؟ کلاس Thread که متد get نداره. لطفا بیشتر توضیح بدهید.
قبل توسط (45 امتیاز)
دقیقا منظورم این بود:

در پکیج java.util.concurrent ، یک Interface به نام Future داریم که متدی به نام ()get داره.

استفاده از این متد ظاهرا concurrency رو از بین می بره. چرا؟!

1 پاسخ

0 امتیاز
قبل توسط (1.1هزار امتیاز)

متد get یک Future باید زمانی فراخوانی شود که جواب یک Future آماده شده است (با متد isDone می توان به این مسئله پی برد) و در غیر اینصورت همزمانی به مشکل بر می خورد. با یک مثال کاملا همه چیز مشخص می شود.

    private static final ExecutorService pool = Executors.newFixedThreadPool(10);

    public static Future<String> startComputation() throws IOException {
        return pool.submit(new Callable<String>() {
            @Override
            public String call() throws Exception {
                Thread.currentThread().sleep(3000);
                return "finish computation";
            }
        });
    }

    public static void main(String[] args) throws IOException, InterruptedException, ExecutionException {
        final Future<String> contentsFuture = startComputation();
        
        while (!contentsFuture.isDone()) {
            System.out.println("computation in progress...");
            System.out.println("do another work");
            Thread.currentThread().sleep(1000);
        }
        
        System.out.println(contentsFuture.get());
        
        System.exit(0);
    }

خروجی کد بالا بصورت زیر است:

computation in progress...
do another work
computation in progress...
do another work
computation in progress...
do another work
finish computation

همانطور که می بینید برای انجام یک کار محاسباتی فرضی که 3 ثانیه طول می کشد تا نتیجه Future آن آمده شود با درست قرار دادن فراخوانی متد get توانسته ایم 3 کار 1 ثانیه ای دیگر را نیز در این فاصله انجام دهیم.

حالا فراخوانی متد get را بدرون while  می بریم و قبل از آماده شدن نتیجه به اشتباه آن را فراخوانی می کنیم.

    private static final ExecutorService pool = Executors.newFixedThreadPool(10);

    public static Future<String> startComputation() throws IOException {
        return pool.submit(new Callable<String>() {
            @Override
            public String call() throws Exception {
                Thread.currentThread().sleep(3000);
                return "finish computation";
            }
        });
    }

    public static void main(String[] args) throws IOException, InterruptedException, ExecutionException {
        final Future<String> contentsFuture = startComputation();
        
        while (!contentsFuture.isDone()) {
            System.out.println("computation in progress...");
            System.out.println("do another work");
            Thread.currentThread().sleep(1000);
            
            System.out.println(contentsFuture.get());
        }
        
        
        
        System.exit(0);
    }

خروجی تکه کد بالا بصورت زیر است:

computation in progress...
do another work
finish computation

همانطور که می بینید بدلیل فراخوانی اشتباه متد get، از کل ظرفیت همزمانی سیستم استفاده نشده است ولی سیستم به مشکل بر نخورده است.

سوالات مشابه

+2 امتیاز
1 پاسخ 813 بازدید
0 امتیاز
1 پاسخ 1.0هزار بازدید
0 امتیاز
1 پاسخ 436 بازدید
+2 امتیاز
1 پاسخ 620 بازدید
+1 امتیاز
0 پاسخ 163 بازدید
+1 امتیاز
1 پاسخ 236 بازدید
سوال شده 9 سال قبل در برنامه نویسی توسط asg.mojtaba (1.2هزار امتیاز)
0 امتیاز
1 پاسخ 303 بازدید
...