C # async / জাভা সমতুল্য?


151

আমি একটি সাধারণ সি # বিকাশকারী তবে মাঝে মাঝে জাভাতে অ্যাপ্লিকেশন বিকাশ করি। আমি ভাবছি সি # অ্যাসিঙ্ক / অপেক্ষার কোন জাভা সমান আছে কিনা? সহজ কথায় জাভা সমতুল্য কী:

async Task<int> AccessTheWebAsync()
{ 
    HttpClient client = new HttpClient();
    var urlContents = await client.GetStringAsync("http://msdn.microsoft.com");
    return urlContents.Length;
}

7
এটি কেন দুর্দান্ত লাগবে: আমাদের প্রজন্মের হিসাবে কলব্যাকগুলি ' মিগুয়েল ডি ইকাজার বিবৃতিতে যান
অ্যান্ড্রুডটন

জাভার বর্তমান সমাধান হ'ল উপসর্গযুক্ত প্রকৃত মানগুলির সাথে ডিল করা নয় async, পরিবর্তে ব্যবহার Futureবা Observableমানগুলি।
এসডি

1
কোন সমতুল্য নেই। এবং এটি ব্যাথা করে এই দু'টি, সহজ শব্দের মত একই প্রভাব না পৌঁছানোর জন্য আপনার আরও একটি নিখুঁত বৈশিষ্ট্যটির জন্য জটিল ওয়ার্কআউন্ডস এবং গ্রন্থাগারগুলির প্রয়োজন।
স্পাইরো

এটি লক্ষণীয় যে দীর্ঘদিন ধরে, জাভা ডিজাইনারগণ জাভা বাইটকোডকে কেবলমাত্র বিদ্যমান বৈশিষ্ট্যগুলির চারপাশে লাইব্রেরি এবং সিনট্যাটিক-চিনির পরিবর্তনের সাথে সামঞ্জস্য রেখে যাওয়ার চেষ্টা করেছেন। জেনারিকগুলি রান-টাইম ধরণের তথ্য সংরক্ষণ করে না এবং ল্যামবার্ডার একটি ইন্টারফেস প্রয়োগকারী অবজেক্ট হিসাবে প্রয়োগ করা হয় তা দেখুন । অ্যাসিঙ্ক / অপেক্ষার জন্য বাইটকোডের সম্ভাব্য হওয়ার জন্য খুব বড় পরিবর্তনগুলি প্রয়োজন এবং তাই আমি খুব শীঘ্রই এটি জাভাতে দেখার আশা করবো না।
ফিলিপ কুলিং

উত্তর:


140

না, জাভাতে অ্যাসিঙ্ক / অপেক্ষার কোনও সমতুল্য নেই - বা এমনকি ভি 5 এর আগে সি # তেও নেই।

পর্দার আড়ালে একটি রাষ্ট্রীয় মেশিন তৈরি করা এটি মোটামুটি জটিল ভাষা বৈশিষ্ট্য।

জাভাতে অ্যাসিনক্রোনাই / কনক্যুরেন্সির জন্য তুলনামূলকভাবে সামান্য ভাষা সমর্থন java.util.concurrentরয়েছে , তবে প্যাকেজে এইগুলির চারপাশে প্রচুর দরকারী ক্লাস রয়েছে। (টাস্ক সমান্তরাল গ্রন্থাগারের তুলনায় একেবারে সমান নয়, তবে এটির নিকটতম সান্নিধ্য))


15
@ ব্যবহারকারী960567: না, আমার বক্তব্যটি এটি একটি ভাষার বৈশিষ্ট্য - এটি কেবল গ্রন্থাগারে রাখা যায় না। আমি বিশ্বাস করি না যে জাভা 8 এর জন্য কমপক্ষে কোনও সমতুল্য নির্ধারিত আছে।
জন স্কিটি

10
@ ব্যবহারকারী960567: আপনার ব্যবহৃত সি # এর সংস্করণ এবং আপনি যে নেট ব্যবহার করছেন সেটি NET এর সংস্করণের মধ্যে পার্থক্য করতে হবে। অ্যাসিঙ্ক / প্রতীক্ষা একটি ভাষা বৈশিষ্ট্য - এটি সি # 5 তে প্রবর্তিত হয়েছিল, হ্যাঁ, আপনি অ্যাসিঙ্কটি ব্যবহার করতে / নেট লক্ষ্য 4 অপেক্ষা করতে মাইক্রোসফ্ট.বিসিএল.এন্সিঙ্ক ব্যবহার করতে পারেন, তবে আপনি এখনও একটি সি # 5 সংকলক ব্যবহার করতে পারেন।
জন স্কিটি

5
@রোজার: না, আসলেই না। অ্যাসিক্রোনির জন্য ইতিমধ্যে একাধিক বিকল্প রয়েছে - তবে আর # জাভা সি # এর মতো ভাষা পরিবর্তন করে না । আমার কাছে আরএক্সের বিপক্ষে কিছু নেই, তবে এটি সি # 5 তে অ্যাসিঙ্কের মতো জিনিস নয়
জন স্কিটি

11
@ ড্যাচনেট: আচ্ছা, অনেকগুলি জেভিএম মেশিনারি রয়েছে যা অ্যাসিঙ্ক্রোনাস, হ্যাঁ ... এটি অ্যাসিঙ্ক্রোনিকে সমর্থনকারী আসল ভাষার বৈশিষ্ট্যগুলি থেকে খুব আলাদা । (সেখানে ASYNC / অপেক্ষা করে আছি খুব ... কিন্তু ASYNC / অপেক্ষায় রয়েছেন তোলে এটা আগে .NET মধ্যে asynchrony অনেকটা ছিল পর্যন্ত । সহজ যে সুবিধা গ্রহণ করতে)
জন স্কিট

1
@ আরকন: আমি যুক্তি দিয়ে বলব যে স্পষ্ট ভাষায় সমর্থন না থাকলে উত্তরটি এখনও সঠিক নয়। এটি কেবল লাইব্রেরির বিষয় নয় যা তফসিলকে সহজ করে তোলে - সি # সংকলক একটি রাজ্য মেশিন তৈরির পুরো উপায়টি এখানে গুরুত্বপূর্ণ।
জন স্কিটি

41

awaitযখন অ্যাসিঙ্ক্রোনাস অপারেশন সম্পন্ন হয়ে (অতিরিক্ত কোড এক্সিকিউট করার জন্য একটি ধারাবাহিকতা ব্যবহার client.GetStringAsync(...))।

সুতরাং, সর্বাধিক নিকটতম আনুমানিক হিসাবে আমি একটি CompletableFuture<T>(জাভা 8 সমান। নেট Task<TResult>) সমেত সমাধান করতে এইচটিটিপি অনুরোধটিকে সংশ্লেষজনকভাবে প্রক্রিয়া করতে ব্যবহার করব।

২-0-০৫-২০১6 এ এসিএনএইচটিপিপ্লায়েন্ট ভি .২ এ আপিল করা হয়েছে ২০১ 2016 সালের ১৩ ই এপ্রিল প্রকাশিত:

সুতরাং জাভা 8 এর ওপি উদাহরণের সমতুল্য AccessTheWebAsync()নিম্নরূপ:

CompletableFuture<Integer> AccessTheWebAsync()
{
    AsyncHttpClient asyncHttpClient = new DefaultAsyncHttpClient();
    return asyncHttpClient
       .prepareGet("http://msdn.microsoft.com")
       .execute()
       .toCompletableFuture()
       .thenApply(Response::getResponseBody)
       .thenApply(String::length);
}

অসিঙ্ক এইচটিপিপি ক্লায়েন্টের অনুরোধ থেকে আমি কীভাবে কমপ্লিটেবল ফিউচার পেতে পারি তার উত্তর থেকে এই ব্যবহারটি নেওয়া হয়েছিল ? এবং যা 2016 এর এপ্রিল 13 ই এপ্রিল প্রকাশিত AsyncHttpClient এর 2 সংস্করণে সরবরাহিত নতুন এপিআই অনুসারে , এর জন্য ইতিমধ্যে অভ্যন্তরীণ সমর্থন রয়েছেCompletableFuture<T>

AsyncHttpClient এর 1 সংস্করণ ব্যবহার করে আসল উত্তর:

এ লক্ষ্যে আমাদের দুটি সম্ভাব্য পন্থা রয়েছে:

  • প্রথমটি অ-অবরুদ্ধ আইও ব্যবহার করে এবং আমি এটি কল করি AccessTheWebAsyncNio। তবুও, কারণ এটি AsyncCompletionHandlerএকটি বিমূর্ত শ্রেণি (কার্যকরী ইন্টারফেসের পরিবর্তে) আমরা একটি ল্যাম্বডাকে আর্গুমেন্ট হিসাবে পাস করতে পারি না। সুতরাং বেনাম শ্রেণীর বাক্যবিন্যাসের কারণে এটি অনিবার্য ভার্বোসিতে জড়িত। তবে এই সমাধানটি প্রদত্ত সি # উদাহরণটির সম্পাদন প্রবাহের সর্বাধিক নিকটবর্তী

  • দ্বিতীয়টি সামান্য কম ভার্বোজ তবে এটি একটি নতুন টাস্ক জমা দেবে যা শেষ পর্যন্ত কোনও থ্রেড ব্লক করে দেবে f.get()যতক্ষণ না প্রতিক্রিয়া সম্পূর্ণ হয়।

প্রথম পদ্ধতির , আরও ভার্বোজ কিন্তু অ-ব্লক করা:

static CompletableFuture<Integer> AccessTheWebAsyncNio(){
    final AsyncHttpClient asyncHttpClient = new AsyncHttpClient();
    final CompletableFuture<Integer> promise = new CompletableFuture<>();
    asyncHttpClient
        .prepareGet("https://msdn.microsoft.com")
        .execute(new AsyncCompletionHandler<Response>(){
            @Override
            public Response onCompleted(Response resp) throws Exception {
                promise.complete(resp.getResponseBody().length());
                return resp;
            }
        });
    return promise;
}

দ্বিতীয় পদ্ধতির কম ভার্বোজ কিন্তু একটি থ্রেড ব্লক করা:

static CompletableFuture<Integer> AccessTheWebAsync(){
    try(AsyncHttpClient asyncHttpClient = new AsyncHttpClient()){
        Future<Response> f = asyncHttpClient
            .prepareGet("https://msdn.microsoft.com")
            .execute();
        return CompletableFuture.supplyAsync(
            () -> return f.join().getResponseBody().length());
    }
}

1
আসলে, এটি সুখের প্রবাহের সমতুল্য। এটি হ্যান্ডলিং ব্যতিক্রমগুলি শেষ পর্যন্ত এবং অন্যদের কভার করে না। এগুলি অন্তর্ভুক্ত করে কোডটি আরও জটিল এবং ত্রুটির প্রবণতায় পরিণত করবে।
হামবু

1
এটি ধারাবাহিকতা নয়। এই উদাহরণটি async / প্রতীক্ষার আসল উদ্দেশ্যকে মিস করে, যা অন্য জিনিসগুলি সম্পাদন করার জন্য বর্তমান থ্রেডটি প্রকাশ করা এবং তারপরে কোনও প্রতিক্রিয়া আসার পরে বর্তমান থ্রেডে এই পদ্ধতির সম্পাদন চালিয়ে যাওয়া। (এটি হয় ইউআই থ্রেডটি প্রতিক্রিয়াশীল হওয়ার জন্য, বা মেমোরির ব্যবহার হ্রাস করার জন্য প্রয়োজনীয়)) এই উদাহরণটি যা একটি সাধারণ ব্লকিং থ্রেড সিঙ্ক্রোনাইজেশন এবং কিছু কলব্যাক।
আলেকসান্দ্র ডাবিনস্কি

1
@ আলেকসান্ডারডুবিনস্কি আমি আপনার সাথে সম্মত হই যখন আপনি নির্দেশ করেন যে কলব্যাক কলার থ্রেডে চলতে পারে না with তুমি ঠিক. আমি একটি থ্রেড ব্লক করা সম্পর্কে দ্বিমত পোষণ করছি। 25-05-2016 -এ আমার আপডেট হওয়া উত্তরটি অবরুদ্ধকরনীয়।
মিগুয়েল গ্যাম্বোয়া

1
.... এবং এই নমুনা হ'ল কারণ অ্যাসিঙ্ক্রোনাস স্টাফ করার সময় সি # এত সহজ লেখার এবং পড়ার সহজ কারণ। এটি জাভাতে কেবল একটি ব্যথা।
স্পাইরো

29

-অ্যাসিঙ্কটি দেখুন যা জাভা বাইটকোড পুনর্লিখনকে অ্যাসিঙ্কটি অনুকরণ করতে / সুন্দরভাবে অপেক্ষা করার জন্য করে। তাদের রিডমি প্রতি: "এটি .NET সিএলআর-তে অ্যাসিঙ্ক-আওয়েত দ্বারা প্রচুর অনুপ্রাণিত হয়েছে"


8
কেউ কি এটি উত্পাদন ব্যবহার করে?
মিস্টার ওয়াং পরের দরজা

1
দেখে মনে হচ্ছে যে ইএ করেছে, আমি মনে করি না যে তারা এমন কোনও কিছুর জন্য অর্থ ব্যয় করবে যা উত্পাদনের জন্য উপযুক্ত নয়।
BrunoJCM

1
কোনও কিছুর জন্য অর্থ ব্যয় করা এবং তারপরে সিদ্ধান্ত নেওয়া যে এটি উত্পাদনের পক্ষে উপযুক্ত নয় এটি বেশ স্বাভাবিক; এটি শেখার একমাত্র উপায়। উত্পাদনে জাভা এজেন্ট সেটিংস ছাড়াই এটি ব্যবহার করা সম্ভব; এর ফলে বারটি কিছুটা কম হওয়া উচিত ( github.com/electronicarts/ea-async )।
23:48

16

অ্যাসিঙ্ক এবং প্রতীক্ষা সিনট্যাকটিক শর্করা। অ্যাসিঙ্ক এবং প্রতীক্ষার সারমর্ম হল রাষ্ট্রীয় যন্ত্র। সংকলকটি আপনার async / অপেক্ষার কোডটিকে একটি রাষ্ট্র মেশিনে রূপান্তর করবে।

একই সময়ে, বাস্তব প্রকল্পগুলিতে অ্যাসিঙ্ক / সত্যিকার অর্থে ব্যবহারের প্রতীক্ষার জন্য, আমাদের ইতিমধ্যে প্রচুর অ্যাসিঙ্ক আই / ও লাইব্রেরি কার্যকারিতা থাকা দরকার। সি # এর জন্য, বেশিরভাগ আসল সিঙ্ক্রোনাইজড আই / ও ফাংশনে বিকল্প অ্যাসিঙ্ক সংস্করণ থাকে। আমাদের এই অ্যাসিঙ্ক ফাংশনগুলির প্রয়োজনীয়তার কারণ হ'ল বেশিরভাগ ক্ষেত্রে আপনার নিজস্ব অ্যাসিঙ্ক / অপেক্ষার কোডটি কিছু লাইব্রেরি অ্যাসিঙ্ক পদ্ধতিতে ফুটে উঠবে।

সি # তে অ্যাসিঙ্ক সংস্করণ গ্রন্থাগার ফাংশন জাভাতে অসিনক্রোনাস চ্যানেল ধারণার মতো। উদাহরণস্বরূপ, আমাদের অ্যাসিনক্রোনাসফিল চ্যানেল.প্রেড রয়েছে যা হয় কোনও ফিউচার ফিরিয়ে দিতে পারে বা রিড অপারেশন শেষ হওয়ার পরে একটি কলব্যাক কার্যকর করতে পারে। তবে এটি ঠিক এক রকম নয়। সমস্ত সি # অ্যাসিঙ্ক ফাংশন টাস্কগুলি (ভবিষ্যতের সাথে সমান তবে ভবিষ্যতের চেয়ে আরও শক্তিশালী) দেয়।

সুতরাং আসুন যাক জাভা do async / প্রতীক্ষা সমর্থন করে এবং আমরা এর মতো কিছু কোড লিখি:

public static async Future<Byte> readFirstByteAsync(String filePath) {
    Path path = Paths.get(filePath);
    AsynchronousFileChannel channel = AsynchronousFileChannel.open(path);

    ByteBuffer buffer = ByteBuffer.allocate(100_000);
    await channel.read(buffer, 0, buffer, this);
    return buffer.get(0);
}

তারপরে আমি কল্পনা করবো যে সংকলকটি মূল async / প্রতীক্ষিত কোডটিকে এমন কিছুতে রূপান্তর করবে:

public static Future<Byte> readFirstByteAsync(String filePath) {

    CompletableFuture<Byte> result = new CompletableFuture<Byte>();

    AsyncHandler ah = new AsyncHandler(result, filePath);

    ah.completed(null, null);

    return result;
}

এবং এখানে অ্যাসিচ হ্যান্ডলারের বাস্তবায়ন:

class AsyncHandler implements CompletionHandler<Integer, ByteBuffer>
{
    CompletableFuture<Byte> future;
    int state;
    String filePath;

    public AsyncHandler(CompletableFuture<Byte> future, String filePath)
    {
        this.future = future;
        this.state = 0;
        this.filePath = filePath;
    }

    @Override
    public void completed(Integer arg0, ByteBuffer arg1) {
        try {
            if (state == 0) {
                state = 1;
                Path path = Paths.get(filePath);
                AsynchronousFileChannel channel = AsynchronousFileChannel.open(path);

                ByteBuffer buffer = ByteBuffer.allocate(100_000);
                channel.read(buffer, 0, buffer, this);
                return;
            } else {
                Byte ret = arg1.get(0);
                future.complete(ret);
            }

        } catch (Exception e) {
            future.completeExceptionally(e);
        }
    }

    @Override
    public void failed(Throwable arg0, ByteBuffer arg1) {
        future.completeExceptionally(arg0);
    }
}

15
সিনট্যাটিক চিনি? অ্যাসিঙ্ক কোড এবং অ্যাসিঙ্ক কোডের চারপাশে কীভাবে ব্যতিক্রমগুলি মোড়ানো যায় সে সম্পর্কে আপনার কোনও ধারণা আছে?
আকাশ কাভা

39
ক্লাসগুলিও সিনট্যাকটিক চিনি। সংকলক সমস্ত গাছ এবং ফাংশন পয়েন্টারগুলির তালিকা তৈরি করে আপনি সাধারণত নিজের জন্য স্বয়ংক্রিয়ভাবে নিজের জন্য লিখতেন। এই ফাংশন / পদ্ধতিগুলি সিনট্যাকটিক চিনিও। তারা সাধারণত সমস্ত গোটো স্বয়ংক্রিয়ভাবে জেনারেট করে আপনি প্রকৃত প্রোগ্রামার হয়ে হাতে হাতে লেখেন। অ্যাসেমব্লার সিনট্যাকটিক চিনিও। রিয়েল প্রোগ্রামাররা ম্যানুয়ালি মেশিন কোড লেখেন এবং ম্যানুয়ালি এটিকে সমস্ত লক্ষ্য আর্কিটেকচারে পোর্ট করেন।
ইয়োমন

32
এটি চিন্তা করে, কম্পিউটারগুলি নিজেরাই l4m3 n00bz এর জন্য কেবল সিনট্যাকটিক চিনি। বাস্তব প্রোগ্রামাররা এগুলিকে কাঠের বোর্ডে ছোট সংহত সার্কিটগুলি সোল্ডার করে এবং সোনার তারের সাথে তাদের সংযুক্ত করে কারণ সার্কিট বোর্ডগুলি সিনট্যাকটিক চিনির মতো, যেমন বড় পরিমাণে উত্পাদন, জুতা বা খাবার।
ইয়োমন

14

ভাষা স্তরে জাভাতে সি # অ্যাসিঙ্ক / অপেক্ষার সমতুল্য নেই। ফাইবার্স ওরফে সমবায় থ্রেড ওরফে লাইটওয়েট থ্রেড হিসাবে পরিচিত একটি ধারণাটি একটি আকর্ষণীয় বিকল্প হতে পারে। আপনি জাভা গ্রন্থাগারগুলি ফাইবারগুলির জন্য সমর্থন সরবরাহ করতে পারেন।

জাভা গ্রন্থাগারগুলি ফাইবার বাস্তবায়ন করে

তন্তুগুলির একটি সুন্দর পরিচয়ের জন্য আপনি এই নিবন্ধটি (কোয়ার্স থেকে) পড়তে পারেন । এটি কীভাবে থ্রেডগুলি জেভিএম এ ফাইবার প্রয়োগ করা যেতে পারে এবং এর সাথে কিছু কোয়ারস নির্দিষ্ট কোড রয়েছে covers


10
সি # তে অ্যাসিঙ্ক / অপেক্ষার ফাইবার নয়। এটি কেবল একটি যাদু সংকলন করে যা Taskকলব্যাকটি রেজিস্টার করে প্রতিশ্রুতি ( ক্লাস) এ ধারাবাহিকতা ব্যবহার করে ।
UltimaWeapon

1
@ অলটিমাওপন আপনি কি তন্তু হিসাবে বিবেচনা করবেন?
আলেকসান্দ্র ডাবিনস্কি

@ আলেকসান্ডারডুবিনস্কি উদাহরণগুলির মধ্যে একটি হ'ল গোরোটিন।
UltimaWeapon

1
@ আলটিমাওয়েপন আমি একটি ব্যাখ্যা খুঁজছিলাম।
আলেকসান্দ্র ডাবিনস্কি

@ আলেকসান্ডারডুবিনস্কি এটি ব্যাখ্যা করতে আমি অলস। আপনি যদি সত্যিই জানতে চান তবে আপনি জোরোটিনের নীচে নিবন্ধটি অনুসন্ধান করতে পারেন।
UltimaWeapon

8

যেমনটি উল্লেখ করা হয়েছিল, সরাসরি কোনও সমতুল্য নেই, তবে জাভা বাইটকোড সংশোধন (অ্যাসিঙ্ক / অপেক্ষার মতো নির্দেশাবলী এবং অন্তর্নিহিত ধারাবাহিকতা বাস্তবায়ন উভয়ের জন্য) দিয়ে খুব কাছাকাছি সান্নিধ্য তৈরি করা যেতে পারে।

আমি এখনই এমন একটি প্রকল্পে কাজ করছি যা জাভাফ্লো ধারাবাহিকতা লাইব্রেরির শীর্ষে অ্যাসিঙ্ক প্রয়োগ করে / অপেক্ষায় রয়েছে , দয়া করে https://github.com/vsilaev/java-async-await দেখুন

কোনও ম্যাভেন মোজো এখনও তৈরি হয়নি, তবে আপনি সরবরাহকৃত জাভা এজেন্টের সাহায্যে উদাহরণ চালাতে পারেন। এখানে async / অপেক্ষার কোডটি কেমন দেখাচ্ছে তা এখানে:

public class AsyncAwaitNioFileChannelDemo {

public static void main(final String[] argv) throws Exception {

    ...
    final AsyncAwaitNioFileChannelDemo demo = new AsyncAwaitNioFileChannelDemo();
    final CompletionStage<String> result = demo.processFile("./.project");
    System.out.println("Returned to caller " + LocalTime.now());
    ...
}


public @async CompletionStage<String> processFile(final String fileName) throws IOException {
    final Path path = Paths.get(new File(fileName).toURI());
    try (
            final AsyncFileChannel file = new AsyncFileChannel(
                path, Collections.singleton(StandardOpenOption.READ), null
            );              
            final FileLock lock = await(file.lockAll(true))
        ) {

        System.out.println("In process, shared lock: " + lock);
        final ByteBuffer buffer = ByteBuffer.allocateDirect((int)file.size());

        await( file.read(buffer, 0L) );
        System.out.println("In process, bytes read: " + buffer);
        buffer.rewind();

        final String result = processBytes(buffer);

        return asyncResult(result);

    } catch (final IOException ex) {
        ex.printStackTrace(System.out);
        throw ex;
    }
}

অ্যাসিঙ্ক্রোনাস এক্সিকিউটেবল হিসাবে কোনও পদ্ধতিকে পতাকাঙ্কিত করে এমনটি হ'ল @ এ্যাসিঙ্ক, হ'ল প্রত্যাশা () এমন একটি ফাংশন যা ধারাবাহিকতা ব্যবহার করে কমলেটেবল ফিউচারের জন্য অপেক্ষা করে এবং "রিটার্ন অ্যাসিনক্রিট (কিছুটা মূল্য)" কলটি যা সম্পর্কিত কমপিটেবলফিউচার / ধারাবাহিকতা চূড়ান্ত করে

সি # এর মতোই, নিয়ন্ত্রণ প্রবাহ সংরক্ষণ করা হয় এবং ব্যতিক্রম হ্যান্ডলিং নিয়মিত পদ্ধতিতে করা যেতে পারে (চেষ্টা করুন / ধারাবাহিকভাবে সম্পাদিত কোডের মতো ধরুন)


6

জাভা নিজেই কোন সমতুল্য বৈশিষ্ট্য নেই, তবে তৃতীয় পক্ষের লাইব্রেরি উপস্থিত রয়েছে যা অনুরূপ কার্যকারিতা প্রস্তাব করে, যেমন কিলিম


3
অ্যাসিঙ্ক / প্রতীক্ষার সাথে এই পাঠাগারটির কোনও সম্পর্ক আছে বলে আমি মনে করি না।
নাটান

5

প্রথমে, async / অপেক্ষা কী তা বুঝুন। এটি একক থ্রেডযুক্ত জিইউআই অ্যাপ্লিকেশন বা একটি দক্ষ সার্ভারের একক থ্রেডে একাধিক "তন্তু" বা "সহ-রুটিন" বা "লাইটওয়েট থ্রেড" চালানোর উপায়।

আপনি যদি সাধারণ থ্রেড ব্যবহার করে ঠিক থাকেন তবে জাভা সমতুল্য ExecutorService.submitএবং Future.get। টাস্ক শেষ না হওয়া পর্যন্ত এটি অবরুদ্ধ হবে এবং ফলাফলটি ফিরে আসবে। এদিকে, অন্যান্য থ্রেড কাজ করতে পারে।

আপনি যদি ফাইবারের মতো কোনও কিছুর সুবিধা চান তবে আপনার পাত্রে সমর্থন (আমার অর্থ জিইউআই ইভেন্ট লুপ বা সার্ভার এইচটিটিপি অনুরোধ হ্যান্ডলারের মধ্যে) বা নিজের লেখার মাধ্যমে প্রয়োজন।

উদাহরণস্বরূপ, সার্লেলেট 3.0 অ্যাসিক্রোনাস প্রসেসিংয়ের প্রস্তাব করে। জাভাএফএক্স অফার javafx.concurrent.Task। যদিও এগুলির ভাষা বৈশিষ্ট্যগুলির কমনীয়তা নেই। তারা সাধারণ কলব্যাকের মাধ্যমে কাজ করে।


2
উইন্ডোজ স্টোর, উইন্ডোজ ডেস্কটপ এবং উইন্ডোজ ফোন অ্যাপ্লিকেশনগুলির মতো ক্লায়েন্ট অ্যাপ্লিকেশনগুলির জন্য, এসাইকের প্রাথমিক সুবিধাটি হ'ল প্রতিক্রিয়া is এই ধরণের অ্যাপ্লিকেশনগুলি ইউআইকে প্রতিক্রিয়াশীল রাখার জন্য মূলত এসিঙ্ক ব্যবহার করে। সার্ভার অ্যাপ্লিকেশনগুলির জন্য, অ্যাসিঙ্কের প্রাথমিক সুবিধাটি স্কেলাবিলিটি। msdn.microsoft.com/en-us/magazine/dn802603.aspx
গ্রানাডা কোডার

3

জাভাতে নেটিভ কিছু নেই যা আপনাকে এসিংক / কীওয়ার্ডের জন্য অপেক্ষা করতে দেয়, তবে আপনি যদি সত্যিই চান তবে একটি কাউন্টডাউনল্যাচ ব্যবহার করতে পারেন আপনি কী করতে পারেন । আপনি পারা তারপর নকল ASYNC / অপেক্ষা (Java7 অন্তত) এই প্রায় ক্ষণস্থায়ী দ্বারা। এটি অ্যান্ড্রয়েড ইউনিট পরীক্ষার একটি সাধারণ অভ্যাস যেখানে আমাদের একটি অ্যাসিঙ্ক কল করতে হবে (সাধারণত কোনও হ্যান্ডলার পোস্ট করা একটি রান্নেবল), এবং তারপরে ফলাফলের জন্য অপেক্ষা করুন (গণনা করুন)।

আপনার পরীক্ষার বিপরীতে আপনার অ্যাপ্লিকেশনটির অভ্যন্তরে এটি ব্যবহার করা যা আমি সুপারিশ করছি তা নয় । এটি চূড়ান্ত হবে কারণ কাউন্টডাউনল্যাচ আপনার উপর নির্ভর করে নির্ভর করে সঠিক সময় এবং সঠিক জায়গাগুলির সঠিক সংখ্যা গণনা করতে।


3

আমি জাভা async / অপেক্ষার পাঠাগারটি তৈরি এবং প্রকাশ করেছি। https://github.com/stofu1234/kamaitachi

এই লাইব্রেরির সংকলক বর্ধনের দরকার নেই এবং জাভাতে স্ট্যাকলেস আইও প্রসেসিং উপলব্ধি করুন।

    async Task<int> AccessTheWebAsync(){ 
        HttpClient client= new HttpClient();
        var urlContents= await client.GetStringAsync("http://msdn.microsoft.com");
       return urlContents.Length;
    }

   ↓

    //LikeWebApplicationTester.java
    BlockingQueue<Integer> AccessTheWebAsync() {
       HttpClient client = new HttpClient();
       return awaiter.await(
            () -> client.GetStringAsync("http://msdn.microsoft.com"),
            urlContents -> {
                return urlContents.length();
            });
    }
    public void doget(){
        BlockingQueue<Integer> lengthQueue=AccessTheWebAsync();
        awaiter.awaitVoid(()->lengthQueue.take(),
            length->{
                System.out.println("Length:"+length);
            }
            );
    }

1

জাভা দুর্ভাগ্যক্রমে async / প্রতীক্ষার সমতুল্য নয়। আপনার নিকটে সবচেয়ে সম্ভবত সম্ভবত পেয়ারা এবং শ্রোতার শৃঙ্খলা থেকে শ্রবণযোগ্য ফিউচারটি পাওয়া যাবে তবে একাধিক অ্যাসিনক্রোনাস কল সম্পর্কিত জড়িত মামলাগুলির জন্য এটি লিখতে এখনও খুব জটিল মনে হবে, কারণ নীড়ের স্তরটি খুব দ্রুত বাড়বে।

আপনি যদি জেভিএম-এর শীর্ষে একটি ভিন্ন ভাষা ব্যবহারের ক্ষেত্রে ঠিক থাকেন তবে ভাগ্যক্রমে স্কালায় অ্যাসিঙ্ক / অপেক্ষার ব্যবস্থা রয়েছে যা একটি সরাসরি সি # অ্যাসিঙ্ক / প্রায় অভিন্ন সিনট্যাক্স এবং শব্দার্থবিজ্ঞানের সমতুল্য অপেক্ষা: https://github.com/scala/ ASYNC /

মনে রাখবেন যে এই কার্যকারিতাটির জন্য সি # তে বেশ উন্নত সংকলক সহায়তার প্রয়োজন ছিল, স্কালায় এটি একটি স্ক্রালার খুব শক্তিশালী ম্যাক্রো সিস্টেমের জন্য একটি লাইব্রেরি হিসাবে যুক্ত করা যেতে পারে এবং তাই স্কেলার পুরানো সংস্করণগুলিতেও যোগ করা যেতে পারে 2.10 এর মতো। অতিরিক্তভাবে স্কালা জাভা সহ শ্রেণীবিন্যাসযোগ্য, তাই আপনি স্কালায় অ্যাসিঙ্ক কোডটি লিখতে পারেন এবং তার পরে জাভা থেকে কল করতে পারেন।

আক্কা ডেটাফ্লো নামে আরও একটি অনুরূপ প্রকল্প রয়েছে http://doc.akka.io/docs/akka/2.3-M1/scala/dataflow.html যা বিভিন্ন শব্দ ব্যবহার করে তবে ধারণাগতভাবে খুব অনুরূপ, তবে মীমাংসিত না করে সীমান্তের ধারাবাহিকতা ব্যবহার করে প্রয়োগ করা হয় (সুতরাং এটি 2.9 এর মতো পুরানো স্কালাল সংস্করণগুলির সাথেও কাজ করে)।


1

জাভা সি সি ল্যাঙ্গুয়েজ বৈশিষ্ট্যটির সমতুল্য অ্যাসিঙ্ক / অপেক্ষার নাম নয়, তবে অ্যাসিঙ্ক / অপেক্ষার যে সমস্যাটি সমাধান করার চেষ্টা করে তার সমস্যাটির আলাদা পদ্ধতির রয়েছে। একে প্রকল্প তাঁত বলা হয় , যা হাই-থ্রুপুট সম্মতিতে ভার্চুয়াল থ্রেড সরবরাহ করবে। এটি ওপেনজেডিকে ভবিষ্যতের কিছু সংস্করণে উপলব্ধ হবে।

এই পদ্ধতিটি " রঙিন ফাংশন সমস্যা " সমাধান করে যা অ্যাসিঙ্ক / অপেক্ষায় রয়েছে has

একই বৈশিষ্ট্যটি গোলং ( গোরোটাইনস ) এও পাওয়া যাবে ।


0

আপনি যদি পরিষ্কার কোডের পরে থাকেন যা জাভাতে অ্যাসিঙ্ক / অপেক্ষার মতো একই প্রভাবটি অনুকরণ করে এবং থ্রেডটি এটি শেষ না হওয়া অবধি ব্লক করতে কিছু মনে করেন না যেমন পরীক্ষা হিসাবে, আপনি এই কোডের মতো কিছু ব্যবহার করতে পারেন:

interface Async {
    void run(Runnable handler);
}

static void await(Async async) throws InterruptedException {

    final CountDownLatch countDownLatch = new CountDownLatch(1);
    async.run(new Runnable() {

        @Override
        public void run() {
            countDownLatch.countDown();
        }
    });
    countDownLatch.await(YOUR_TIMEOUT_VALUE_IN_SECONDS, TimeUnit.SECONDS);
}

    await(new Async() {
        @Override
        public void run(final Runnable handler) {
            yourAsyncMethod(new CompletionHandler() {

                @Override
                public void completion() {
                    handler.run();
                }
            });
        }
    });

0

অ্যাসিনহেল্পার জাভা লাইব্রেরিতে অ্যাসিক্রোনাস কলগুলির জন্য ইউটিলিটি ক্লাস / পদ্ধতির একটি সেট অন্তর্ভুক্ত রয়েছে (এবং অপেক্ষা করুন)।

যদি অ্যাসিঙ্ক্রোনালি পদ্ধতিতে কল কল বা কোড ব্লকগুলির একটি সেট চালানোর ইচ্ছা হয়, তবে এটিতে একটি সহায়ক সহায়ক পদ্ধতি অ্যাসিঙ্কটাস্ক অন্তর্ভুক্ত রয়েছে ub সাবমিট টাস্কগুলি নীচের স্নিপেটের মতো।

AsyncTask.submitTasks(
    () -> getMethodParam1(arg1, arg2),
    () -> getMethodParam2(arg2, arg3)
    () -> getMethodParam3(arg3, arg4),
    () -> {
             //Some other code to run asynchronously
          }
    );

যদি সমস্ত অ্যাসিঙ্ক্রোনাস কোড চলমান শেষ না হওয়া পর্যন্ত এটি অপেক্ষা করা পছন্দ করে তবে অ্যাসিঙ্কটাস্ক.সুমিতটাস্কসঅ্যান্ড ওয়েইট ভেরিয়েন্ট ব্যবহার করা যেতে পারে।

এছাড়াও যদি প্রতিটি অ্যাসিনক্রোনাস পদ্ধতি কল বা কোড ব্লকের কাছ থেকে কোনও রিটার্ন মান অর্জন করতে ইচ্ছুক থাকে তবে অ্যাসিঙ্কসপ্লায়ারস। সাবমিটসপ্লায়ার্স ব্যবহার করা যেতে পারে যাতে পদ্ধতিটি দ্বারা সরবরাহিত ফলাফল সরবরাহকারী অ্যারে থেকে ফলাফলটি পাওয়া যায়। নীচে নমুনার স্নিপেট রয়েছে:

Supplier<Object>[] resultSuppliers = 
   AsyncSupplier.submitSuppliers(
     () -> getMethodParam1(arg1, arg2),
     () -> getMethodParam2(arg3, arg4),
     () -> getMethodParam3(arg5, arg6)
   );

Object a = resultSuppliers[0].get();
Object b = resultSuppliers[1].get();
Object c = resultSuppliers[2].get();

myBigMethod(a,b,c);

যদি প্রতিটি পদ্ধতির রিটার্নের ধরন পৃথক হয় তবে নীচের ধরণের স্নিপেট ব্যবহার করুন।

Supplier<String> aResultSupplier = AsyncSupplier.submitSupplier(() -> getMethodParam1(arg1, arg2));
Supplier<Integer> bResultSupplier = AsyncSupplier.submitSupplier(() -> getMethodParam2(arg3, arg4));
Supplier<Object> cResultSupplier = AsyncSupplier.submitSupplier(() -> getMethodParam3(arg5, arg6));

myBigMethod(aResultSupplier.get(), bResultSupplier.get(), cResultSupplier.get());

অ্যাসিক্রোনাস পদ্ধতি কল / কোড ব্লকের ফলাফলও একই থ্রেডের কোডের ভিন্ন পয়েন্টে বা নীচের স্নিপেটের মতো আলাদা থ্রেডে পাওয়া যাবে।

AsyncSupplier.submitSupplierForSingleAccess(() -> getMethodParam1(arg1, arg2), "a");
AsyncSupplier.submitSupplierForSingleAccess(() -> getMethodParam2(arg3, arg4), "b");
AsyncSupplier.submitSupplierForSingleAccess(() -> getMethodParam3(arg5, arg6), "c");


//Following can be in the same thread or a different thread
Optional<String> aResult = AsyncSupplier.waitAndGetFromSupplier(String.class, "a");
Optional<Integer> bResult = AsyncSupplier.waitAndGetFromSupplier(Integer.class, "b");
Optional<Object> cResult = AsyncSupplier.waitAndGetFromSupplier(Object.class, "c");

 myBigMethod(aResult.get(),bResult.get(),cResult.get());
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.