এটি আবেদনের উপর নির্ভর করে।
কেস যা কল্পনা একাধিক থ্রেড একটি টোকেন চান কিছু করতে বিশ্বব্যাপী হার-সীমিত কর্ম সঙ্গে কোনো মঞ্জুরিপ্রাপ্ত ফেটে (অর্থাত আপনি 10 সেকেন্ডের 10 ক্রিয়া সীমিত করতে চাই কিন্তু 10 ক্রিয়া প্রথম দ্বিতীয় ঘটতে করতে চান না এবং তারপর থাকা 9 সেকেন্ড বন্ধ)।
বিলম্বিত কিউয়ের একটি অসুবিধা রয়েছে: যে থ্রেডগুলিতে টোকেনগুলি অনুরোধ করে তার ক্রমটি তারা অনুরোধটি পূরণ করার আদেশ হতে পারে না। যদি টোকেনের জন্য অপেক্ষা করে একাধিক থ্রেডগুলি অবরুদ্ধ করা হয় তবে এটি উপলব্ধ নয় যে পরবর্তী কোনটি টোকেন গ্রহণ করবে। এমনকি আপনি আমার দৃষ্টিতে থ্রেড চিরকাল অপেক্ষা করতে পারেন।
একটি সমাধান হ'ল ধারাবাহিকভাবে দুটি ক্রিয়াগুলির মধ্যে ন্যূনতম সময়ের ব্যবধান থাকা এবং তাদের অনুরোধ অনুসারে একই ক্রমে পদক্ষেপ নেওয়া।
এখানে একটি বাস্তবায়ন:
public class LeakyBucket {
protected float maxRate;
protected long minTime;
//holds time of last action (past or future!)
protected long lastSchedAction = System.currentTimeMillis();
public LeakyBucket(float maxRate) throws Exception {
if(maxRate <= 0.0f) {
throw new Exception("Invalid rate");
}
this.maxRate = maxRate;
this.minTime = (long)(1000.0f / maxRate);
}
public void consume() throws InterruptedException {
long curTime = System.currentTimeMillis();
long timeLeft;
//calculate when can we do the action
synchronized(this) {
timeLeft = lastSchedAction + minTime - curTime;
if(timeLeft > 0) {
lastSchedAction += minTime;
}
else {
lastSchedAction = curTime;
}
}
//If needed, wait for our time
if(timeLeft <= 0) {
return;
}
else {
Thread.sleep(timeLeft);
}
}
}