জাভা.আলং বোঝা


91

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

দ্বিতীয়ত, জাভা থ্রেড এপিআইতে পার্কের পদ্ধতিটি দেখে

অনুমতিটি উপলব্ধ না হলে থ্রেড শিডিংয়ের উদ্দেশ্যে বর্তমান থ্রেড অক্ষম করে।

যদি অনুমতি পাওয়া যায় তবে তা গ্রাস হয়ে যায় এবং কলটি তত্ক্ষণাত্ ফিরে আসে; অন্যথায় বর্তমান থ্রেড সূচি নির্ধারণের উদ্দেশ্যে অক্ষম হয়ে যায় এবং তিনটি জিনিসের একটির না হওয়া পর্যন্ত সুপ্ত থাকে .....

ইংরাজী আমার প্রাথমিক ভাষা নয়, সুতরাং বুঝতে আমার কিছুটা অসুবিধা হচ্ছে যে, আমি 'পার্ট করার অনুমতি' এক ধরণের হিসাবে 'পারমিট' করতে চেয়েছিলাম, সুতরাং যে প্রশ্নগুলি অনুসরণ করা হয়:

  • এর অর্থ কী, 'অনুমতি' কী, এবং কে এবং কীভাবে এই অনুমতিগুলি পরীক্ষা করছে?
  • এর অর্থ কী: 'যদি অনুমতি পাওয়া যায় তবে তা খাওয়া হয়', এটি কি 'পার্কিং' হচ্ছে?
  • নিম্নলিখিতটি, যদি দ্বিতীয় বিষয়টি সত্য হয়, তবে 'পার্কিং' এবং 'মিথ্যা সুপ্ত' এর মধ্যে পার্থক্য কী? যদি আমার কাছে অনুমতি থাকে তবে আমি এটিকে চিরতরে পার্কিং করতে পারি এবং যদি না হয় তবে আমি এটি 'সুপ্ত' করতে পারি?

ধন্যবাদ

উত্তর:


37

অনুমতি মানেই কার্যকর করা চালিয়ে যাওয়ার অনুমতি। পার্কিং মানে পারমিট পাওয়া না পাওয়া পর্যন্ত কার্যকর করা স্থগিত করা।

এর অনুমতিগুলির বিপরীতে Semaphore, পারমিটগুলি LockSupportথ্রেডের সাথে যুক্ত থাকে (অর্থাত কোনও নির্দিষ্ট থ্রেডকে অনুমতি দেওয়া হয়) এবং জমা হয় না (যেমন থ্রেডে কেবলমাত্র একটি অনুমতি থাকতে পারে, যখন থ্রেড অনুমতি গ্রহণ করে, এটি অদৃশ্য হয়ে যায়)।

আপনি কল করে কোনও থ্রেডকে অনুমতি দিতে পারেন unpark()। অনুমতি প্রাপ্ত না হওয়া অবধি (বা থ্রেড বাধাগ্রস্ত হয় বা টাইমআউট সমাপ্ত হওয়া ইত্যাদি) কল করে একটি থ্রেড তার কার্যকরকরণ স্থগিত করতে পারে park()। যখন অনুমতি পাওয়া যায়, পার্ক করা থ্রেড এটি গ্রাস করে এবং কোনও park()পদ্ধতি থেকে প্রস্থান করে ।


4
সুতরাং পুনরায় ধরে রাখুন, যদি থ্রেড বি থ্রেডের জন্য 'পার্ক' কল করে তবে অনুমতিটি পাওয়া যায়, যা 'বি পার্ক করা যায় না', তবে এ দ্বারা করা কলটি কেবল ফিরে আসে এবং বি পার্ক হয় না। অন্যথায় যখন কোনও অনুমতি পাওয়া যায় না, তখন বি কে মানতে হবে। সুতরাং, অপেক্ষার (পার্কিং) অর্থ কি "এ আমাকে পার্কিং করার চেষ্টা করছে কারণ আমার অনুমতি নেই তবে আমি এখনই তা করতে পারি না তাই আমি এটিকেও ব্লক করছি"? এই দীর্ঘ বাক্যটির জন্য দুঃখিত। আমি মনে করি এই অপেক্ষারটি যথেষ্ট সম্পদ ব্যয়কারী। আমি এখনও ভাবছি পুরো পারমিট জিনিসটি কে পরিচালনা করছেন। কে / কী সিদ্ধান্ত নিচ্ছে যে কোনও থ্রেডের অনুমতি রয়েছে, অন্যরা নেই।
লিওনার্দো

4
@ লিওনার্দো: একটি থ্রেড কেবল নিজেই পার্ক করতে পারে, অন্য থ্রেড পার্ক করার কোনও উপায় নেই। সুতরাং, কল করার park()অর্থ "অন্য কোনও থ্রেড আমাকে কল করে অনুমতি না দেওয়ার আগ পর্যন্ত আমি আমার মৃত্যুদণ্ড স্থগিত করতে চাই unpark()"।
axtavt

সুতরাং একটি থ্রেড অন্য থ্রেড পার্ক করতে পারে না, তবে অন্যান্য থ্রেড দ্বারা আনপার্ক করা যায়? এটা কি ঠিক ? তো, কখন যে পার্কিং হয়? এই মুহুর্তে কোনও থ্রেডের কোনও কাজ নেই, এবং এটি পরীক্ষা করার উপায় এটির অনুমতিটির জন্য ক্রমাগত তাকান? উদাহরণস্বরূপ এটি ডেমন থ্রেডের পক্ষে ভাল।
লিওনার্দো

এছাড়াও, ওয়েটিং (পার্কিং) এর অর্থ হল এটি পার্ক করার জন্য অপেক্ষা করছে, বা পার্ক হওয়ার পরে অপেক্ষার স্থানে রয়েছে? দুঃখিত আমি জানি এটি একটি বোবা প্রশ্ন :-)
লিওনার্দো

4
@ লিওনার্দো: এটি পার্ক করার পরে একটি অপেক্ষা রাষ্ট্রের অর্থ।
axtavt

11

জাভা থ্রেড স্টেট ডকুমেন্টেশন অনুসারে , একটি থ্রেড তিনটি কারণে অপেক্ষার স্থানে যেতে পারে:

  1. সময়সীমা ছাড়াই অবজেক্ট.উইট
  2. সময়সীমা ছাড়াই থ্রেড.জয়িন
  3. লকসপোর্ট.পার্ক

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

সুতরাং, যখন আপনার থ্রেডটি লকসপোর্ট.পার্ক দ্বারা ওয়েটিং মোডে থাকবে তখন এটি আপনাকে অপেক্ষা (পার্কিং) হিসাবে দেখায়।

দয়া করে নোট করুন যে, আপনি কেবল বর্তমান থ্রেডে পার্ক কল করতে পারেন। এটি প্রযোজক-গ্রাহক ডিজাইন প্যাটার্ন বাস্তবায়নের জন্য খুব সহায়ক ব্যবস্থা।


3

শ্রেণীর বিবরণ থেকে ( লকসপোর্ট জাভাদকের শীর্ষে ) যেখানে অনুমতিটির বর্ণনা দেওয়া হয়েছে:

এই শ্রেণিটি এটি ব্যবহার করে এমন প্রতিটি থ্রেডের সাথে জুড়ে দেয় , একটি পারমিট (সেমফোর বর্গের অর্থে)। পার্ক টু কল যদি পারমিট পাওয়া যায় তত্ক্ষণাত্ ফিরে আসবে, প্রসেসে [পারমিট] গ্রাস করবে; অন্যথায় [পার্কে কল] অবরুদ্ধ হতে পারে। আনপার্কে কল করার অনুমতিটি যদি তা ইতিমধ্যে উপলব্ধ না থাকে তবে তা উপলব্ধ করে। (যদিও সেমোফোরগুলির সাথে পৃথক, অনুমতিগুলি জমে না There সেখানে বেশিরভাগটি একটি রয়েছে))

( অ-ইংরেজী ভাষীদের পক্ষে পড়া সহজ করার জন্য আমি [পাঠ্য] প্রসারিত করেছি ))

আশা করি গভীর বোধগম্য কেউ এই বিষয়ে বিস্তারিত বলতে পারবেন। অ্যাক্সটাভেটের উত্তর দেখুন।

চূড়ান্ত নোট হিসাবে, জাভাডোকের একটি চূড়ান্ত উদ্ধৃতি:

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


3

যে অংশটি আমাকে এই প্রশ্নের পুনর্বিবেচনা করতে বাধ্য করেছিল যে ডকুমেন্টেশন পড়ার সময় আমি প্রায় পেতে পারি না তা হ'ল:

যদি অনুমতিটি পাওয়া যায় তবে তা গ্রাস হয়ে যায় এবং কলটি তত্ক্ষণাত ফিরে আসে ...

সুতরাং যখন অনুমতিটি "উপলভ্য" হয়, তখন কে এবং কীভাবে এটি উপলব্ধ করে, যাতে এটি তাত্ক্ষণিকভাবে গ্রাস করতে পারে? এটি কোনওভাবে তুচ্ছ ছিল তা জানতে:

public static void main(String[] args) {

    Thread parkingThread = new Thread(() -> {
        System.out.println("Will go to sleep...");
        sleepTwoSeconds();
        System.out.println("Parking...");
        // this call will return immediately since we have called  LockSupport::unpark
        // before this method is getting called, making the permit available
        LockSupport.park();
        System.out.println("After parking...");
    });

    parkingThread.start();

    // hopefully this 1 second is enough for "parkingThread" to start
    // _before_ we call un-park
    sleepOneSecond();
    System.out.println("Un-parking...");
    // making the permit available while the thread is running and has not yet
    // taken this permit, thus "LockSupport.park" will return immediately
    LockSupport.unpark(parkingThread);

}

private static void sleepTwoSeconds() {
    try {
        Thread.sleep(1000 * 2);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

private static void sleepOneSecond() {
    try {
        Thread.sleep(1000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}    

কোড নিজেই জন্য কথা বলে, threadচলমান কিন্তু এখনও বলা LockSupport.park, যখন কিছু অন্যান্য থ্রেড কল LockSupport.unparkএটা - এইভাবে পারমিট উপলব্ধ। এর পরে আমরা কল করি LockSupport.parkএবং অনুমতিটি উপলব্ধ হওয়ার সাথে সাথে তা ফিরে আসে।

একবার আপনি এটি সম্পর্কে চিন্তাভাবনা করলে, এটি কিছুটা বিপজ্জনক, যদি আপনি কিছু নিয়ন্ত্রণ করেন না এমন কোডগুলিতে আপনার থ্রেডগুলি প্রকাশ করে এবং সেই কোডটি তার পরে LockSupport.unparkযখন আপনি কল করেন park- এটি কার্যকর নাও হতে পারে।


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

@ অ্যালফ্রেডএক্সিয়াও সম্মত হয়েছেন, এটি এমন একটি বিষয় যা আমাকেও অবাক করে দিয়েছে, তবে এটি অনুমান করে তোলে।
ইউজিন

1

যেহেতু আমি এটি বুঝতে পারি, "পারমিট" হ'ল একটি অবজেক্ট যা প্রতিনিধিত্ব করে যদি কোনও থ্রেড "আনপার্কড" করা যায় কি না। এবং এটি নিজেই থ্রেড দ্বারা পরীক্ষা করা হয় (বা আপনি যখন একটি থ্রেড পার্ক করার চেষ্টা করেন তখন ডি জেআরই) "গ্রাস" করা জিনিসটি আমি বুঝতে পারি যে অনুমতিটি বিলুপ্ত হয়ে যায় এবং থ্রেডটি অক্ষম নয়।

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

সিপিইউ / মেমরির ব্যবহার হিসাবে, আমি মনে করি এটি ওএস ইত্যাদির উপর নির্ভর করে ...

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