না, পদ্ধতিগুলি সিঙ্ক্রোনাইজ করার দরকার নেই এবং আপনার কোনও পদ্ধতি সংজ্ঞায়িত করার দরকার নেই; তারা ইতিমধ্যে কনক্র্যান্টলিঙ্কড কিউতে রয়েছে, কেবল তাদের ব্যবহার করুন। সাম্প্রতিক লিঙ্কযুক্ত কিউ আপনার অভ্যন্তরীণভাবে প্রয়োজনীয় সমস্ত লকিং এবং অন্যান্য ক্রিয়াকলাপগুলি করে; আপনার উত্পাদক (গুলি) কাতারে ডেটা যুক্ত করে এবং আপনার ভোক্তারা এটির জন্য জরিপ করে।
প্রথমে আপনার সারিটি তৈরি করুন:
Queue<YourObject> queue = new ConcurrentLinkedQueue<YourObject>();
এখন আপনি যেখানেই আপনার উত্পাদক / ভোক্তা অবজেক্ট তৈরি করছেন, সারিতে পাস করুন যাতে তাদের বস্তুগুলি রাখার জন্য কোথাও রয়েছে (পরিবর্তে আপনি এটির জন্য একটি সেটর ব্যবহার করতে পারেন, তবে আমি এই ধরণের জিনিসটি কোনও কনস্ট্রাক্টারে করতে পছন্দ করি):
YourProducer producer = new YourProducer(queue);
এবং:
YourConsumer consumer = new YourConsumer(queue);
এবং এতে আপনার প্রযোজকটিতে স্টাফ যুক্ত করুন:
queue.offer(myObject);
এবং আপনার ভোক্তাতে স্টাফ বের করুন (যদি সারিটি খালি থাকে তবে পোল () বাতিল হবে, সুতরাং এটি পরীক্ষা করুন):
YourObject myObject = queue.poll();
আরও তথ্যের জন্য জাভাদোক দেখুন
সম্পাদনা:
আপনার যদি সারিটি খালি না হওয়ার অপেক্ষায় অবরুদ্ধ করতে হয় তবে আপনি সম্ভবত একটি লিঙ্কডব্লকিংকিউ ব্যবহার করতে এবং টেক () পদ্ধতিটি ব্যবহার করতে চান। তবে, লিংকডব্লকিংকিউয়ের সর্বাধিক ক্ষমতা রয়েছে (পূর্ণসংখ্যার ডিফল্ট MA MAX_VALUE, যা দুই বিলিয়ন এরও বেশি) এবং এটি আপনার পরিস্থিতির উপর নির্ভর করে উপযুক্ত হতে পারে বা নাও পারে।
যদি আপনার কাছে কেবল একটি থ্রেড থাকে যা কাতারে স্টাফ রাখে এবং অন্য থ্রেডটি কাতারের বাইরে স্টাফ নেয়, তবে কনকন্টারলিংকুইউ সম্ভবত ওভারকিল। আপনার যখন একই সাথে কয়েক হাজার বা হাজার হাজার থ্রেড একসাথে কাতারে অ্যাক্সেস করতে পারে তখন এটি আরও বেশি। আপনার প্রয়োজনগুলি সম্ভবত ব্যবহার করে পূরণ করা হবে:
Queue<YourObject> queue = Collections.synchronizedList(new LinkedList<YourObject>());
এর একটি প্লাস হ'ল এটি উদাহরণ (লাইন) এ লক করে, তাই আপনি যৌগিক ক্রিয়াকলাপের পারমাণবিকতা নিশ্চিত করার জন্য কাতারে সিংক্রোনাইজ করতে পারেন (জারেড ব্যাখ্যা করেছেন)। উদাহরণস্বরূপ লকিংয়ের বাইরে (java.util.concurrent.atomic ভেরিয়েবলগুলি ব্যবহার করে) সমস্ত ক্রিয়াকলাপ যেমন করা হয় তেমনি আপনি কনকোয়ারেন্টলিঙ্কড কিউ দিয়ে এটি করতে পারবেন না। সারি খালি থাকার সময় আপনি যদি ব্লক করতে চান তবে আপনার এটি করার প্রয়োজন হবে না, কারণ পোল () সারি খালি থাকার সময় শূন্য হয়ে যাবে, এবং পোল () পারমাণবিক। জরিপ () বাতিল করে দেয় কিনা তা পরীক্ষা করে দেখুন। যদি এটি হয়, অপেক্ষা করুন (), তবে আবার চেষ্টা করুন। লক করার দরকার নেই।
শেষ অবধি:
সত্যি বলতে, আমি কেবল একটি লিঙ্কডব্লকিংকুই ব্যবহার করব। এটি এখনও আপনার আবেদনের জন্য ওভারকিল, তবে এটি কার্যকরভাবে কার্যকর হবে ds যদি এটি যথেষ্ট পারফরম্যান্ট না হয় (প্রোফাইলে!), আপনি সর্বদা অন্য কিছু চেষ্টা করতে পারেন এবং এর অর্থ এটি আপনাকে কোনও সিঙ্ক্রোনাইজড স্টাফের সাথে ডিল করতে হবে না:
BlockingQueue<YourObject> queue = new LinkedBlockingQueue<YourObject>();
queue.put(myObject);
YourObject myObject = queue.take();
অন্য সব কিছুই এক রকম। পুট সম্ভবত অবরুদ্ধ হবে না, কারণ আপনি সম্ভবত দুই বিলিয়ন বস্তুকে কাতারে রাখবেন না।