তফসিলআডফিক্সডেরেট বনাম শিডিয়োলেফিক্সডডিলে


117

তফসিলি এক্সেকিউটারসেবারের পদ্ধতির scheduleAtFixedRateএবং scheduleWithFixedDelayপদ্ধতির মধ্যে প্রধান পার্থক্য কী ?

scheduler.scheduleAtFixedRate(new Runnable() {
    @Override
    public void run() {
        System.out.println("scheduleAtFixedRate:    " + new Date());
    }
}, 1, 3L , SECONDS);

scheduler.scheduleWithFixedDelay(new Runnable() {
    @Override
    public void run() {
        System.out.println("scheduleWithFixedDelay: " + new Date());
    }
}, 1, 3L , SECONDS);

তারা ঠিক একই সময়ে মুদ্রণ করে, মনে হয় ঠিক একই ব্যবধানে এগুলি কার্যকর করা হয়েছে।

উত্তর:


206

Thread.sleep(1000);আপনার run()পদ্ধতির মধ্যে একটি কল যুক্ত করার চেষ্টা করুন ... মূলত পূর্বের কার্যকর প্রয়োগটি কখন শেষ হয় এবং কখন এটি (যৌক্তিকভাবে) শুরু হয় তার উপর ভিত্তি করে কোনও কিছু নির্ধারণের মধ্যে পার্থক্য ।

উদাহরণস্বরূপ, ধরুন আমি এক ঘন্টার মধ্যে একবারে নির্দিষ্ট হার নিয়ে চলে যাওয়ার জন্য অ্যালার্মের সময়সূচী করি এবং প্রতিবার এটি বন্ধ হয়, আমার কাছে এক কাপ কফি আছে, যা 10 মিনিট সময় নেয়। ধরা যাক যে মধ্যরাতে শুরু হয়, আমার ছিল:

00:00: Start making coffee
00:10: Finish making coffee
01:00: Start making coffee
01:10: Finish making coffee
02:00: Start making coffee
02:10: Finish making coffee

যদি আমি এক ঘন্টা স্থির দেরি করে শিডিয়ুল করি তবে আমার কাছে তা হবে:

00:00: Start making coffee
00:10: Finish making coffee
01:10: Start making coffee
01:20: Finish making coffee
02:20: Start making coffee
02:30: Finish making coffee

আপনি যা চান তা আপনার কাজের উপর নির্ভর করে।


18
যদি কফি তৈরি করতে এক ঘন্টার বেশি সময় লাগে তবে ফিক্সডরেট দৃশ্যে কী ঘটে?
ব্রেট ভ্যান্ডারভেইন

5
@ ব্রাটভ্যান্ডারভেইন: আমি বিশ্বাস করি যে এটি প্রশ্নযুক্ত নির্বাহকের উপর নির্ভর করে। এটি সময়মতো নির্ধারিত হবে - তবে এটি কার্যকর করে কিনা সেই নির্বাহকের পক্ষে কোনও থ্রেড উপলব্ধ কিনা তা নির্ভর করে। আমি আপনাকে বিভিন্ন পরিস্থিতিতে এটি কীভাবে কাজ করে তা পরীক্ষার পরামর্শ দিচ্ছি।
জন স্কিটি

8
@ ব্রেটভ্যান্ডারভিন ডকুমেন্টেশন থেকে , "যদি এই কাজের কোনও কার্যকরকরণ তার সময়ের চেয়ে বেশি সময় নেয়, তবে পরবর্তী মৃত্যুদণ্ডগুলি দেরিতে শুরু হতে পারে, তবে যুগপত সম্পাদন হবে না।" অন্য কথায়, একটি অনুসারী বাস্তবায়ন পূর্বেরটি শেষ না হওয়া পর্যন্ত পরবর্তীটিকে কার্যকর করতে দেয় না।
এম জাস্টিন

আপনি কি আমার মতো একজন নবজাতকের জন্য দেখানো আউটপুট (কফি) এর জন্য একটি ওয়ার্কিং কোড সরবরাহ করতে পারেন?
মুনেশসিংহ

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

57

অনুরোধ scheduleAtFixedRateপদ্ধতির সময় সিরিজটি ভিজ্যুয়ালাইজ করুন । শেষের সময়কালের চেয়ে বেশি সময় নিলে পরবর্তী মৃত্যুদণ্ডগুলি অবিলম্বে শুরু হবে। অন্যথায়, এটি পিরিয়ড সময়ের পরে শুরু হবে।

অনুরোধের সময়সূচীএটিফিক্সডরেট পদ্ধতির সময় সিরিজ

অনুরোধ scheduleWithFixedDelayপদ্ধতির সময় সিরিজ । একের কার্যকরকরণের সময় নির্বিশেষে, একের কার্যকরকরণের সমাপ্তি এবং পরবর্তী শুরুর মধ্যবর্তী সময়ের পরে পরবর্তী সম্পাদন শুরু হবে

অনুরোধের সময়সূচির সময় সিরিজ উইথফিক্সডডেলি পদ্ধতি lay

আশা আপনাকে সাহায্য করতে পারে


অ্যাটফিক্সডরেট সময় সিরিজের ডায়াগ্রামের সময়সূচীতে উল্লিখিত "অতিরিক্ত" শব্দটি বুঝতে পারি না।
মুনেশসিংহ

1
@ মুনেশসিংহ এটি বোঝাতে বোঝানো হয়েছে যে কার্য সম্পাদনের সময় নির্ধারিত সময়ের চেয়ে বেশি সময়, সুতরাং এটি "অতিরিক্ত" সময় নেয় এবং পরবর্তী কার্য সম্পাদন অবিলম্বে শুরু হয়।
ভাইওরেল

@ ভাইওরেল স্পষ্ট করার জন্য ধন্যবাদ। এর অর্থ কি "পিরিয়ড" হ'ল একটানা দু'জন মৃত্যুদণ্ড কার্যকর হওয়া সময়ের মধ্যে স্থির সময়ের বিলম্ব নয়।
মুনেশসিংহ

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

4

scheduleAtFixedRate()পদ্ধতি একটি নতুন টাস্ক এবং এটি জমা নির্বাহক প্রতি কাল, সৃষ্টি হোক বা না হোক পূর্ববর্তী কাজের সমাপ্ত নির্বিশেষে

অন্যদিকে, scheduleWithFixedDelay()পদ্ধতিটি পূর্ববর্তী কাজ শেষ হওয়ার পরে একটি নতুন টাস্ক তৈরি করে ।


আপনি দুবার লিখেছেন scheduleAtFixedRate:)
ভ্লাদ

3

আপনি যদি জাভা ডকটি পড়েন তবে এটি আরও পরিষ্কার হবে

তফসিলফিউচার শিডিউলএটিফিক্সডরেট (চলমান কমান্ড, দীর্ঘ প্রাথমিক ডিলি, দীর্ঘকালীন, সময়উনিট ইউনিট) একটি নির্দিষ্ট পর্যায়ক্রমিক ক্রিয়া তৈরি করে এবং সম্পাদন করে যা প্রদত্ত প্রাথমিক বিলম্বের পরে প্রথমে সক্ষম হয়ে যায় এবং পরবর্তী সময়ে প্রদত্ত সময়কালের সাথে; এটি হ'ল মৃত্যুদন্ডগুলি প্রাথমিকের পরে ডেলি শুরু হবে আর ইনিশিয়ালডিলে + পিরিয়ড, তারপরে ইনিশিয়ালডিলে + 2 * পিরিয়ড এবং আরও অনেক কিছু।

শিডিউলফিউচার শিডিউল উইথফিক্সডডেলি (রান্নেবল কমান্ড, দীর্ঘ প্রাথমিক ডিলি, দীর্ঘ বিলম্ব, টাইমউনিট ইউনিট) একটি নির্দিষ্ট পর্যায়ক্রমিক ক্রিয়া তৈরি করে এবং কার্যকর করে যা প্রদত্ত প্রাথমিক বিলম্বের পরে প্রথমে সক্ষম হয়ে যায় এবং পরবর্তীতে একটি কার্যকরকরণের সমাপ্তি এবং পরবর্তীটির সূচনার মধ্যবর্তী প্রদত্ত বিলম্বের সাথে।


1

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

আমি মনে করি যে এটি আপনাকে বড় সমস্যা পেয়ে যাওয়ার কারণে পদ্ধতি Becuase চয়ন করতে সহায়তা করবে


1
কি? জেভিএম সিদ্ধান্ত নেবে? এর মানে কী? এটি সত্য যে ScheduledThreadPoolExecutor
দৌড়ানোর যোগ্যটি

না আমি আমার আবেদনে অনুরূপ সমস্যাটি খুঁজে পাইনি যেখানে আমি 15 মিনিটের ব্যবধান দিয়েছি এবং প্রথম কাজটি 15 মিনিটের মধ্যে শেষ হচ্ছে না এবং 15.30 সেকেন্ড সময় নিয়েছে তাই দ্বিতীয় কার্যটি তাৎক্ষণিকভাবে শুরু করা হয়নি 5 মিনিটের পরে কিছুটা সময় পরে 8 মিনিট এবং আমি সচেতন নই যে আমরা এই আচরণটি মানক আচরণ নয় বলে এটি নিয়ন্ত্রণ করতে পারি কিনা।
ব্যবহারকারী 1047873

এটি পাঠ্যপুস্তক টাস্কের সারি লাগানোর মতো শোনাচ্ছে।
Ordous

হ্যাঁ, এর অর্থ হ'ল আপনার নির্বাহকের সমস্ত থ্রেড ইতিমধ্যে কিছু করতে ব্যস্ত এবং আপনার কাজটি করার জন্য একটি সারিতে সজ্জিত হয়ে যায়। ( দ্রষ্টব্য কাতারটি দেখে বা নির্বাহক থ্রেডগুলি কী করছে তা দেখে আপনার এটি নিশ্চিত হওয়া দরকার)। আপনি কীভাবে এটি নিয়ন্ত্রণ করেন তা নির্ভর করে আপনার কী ধরণের এক্সিকিউটার রয়েছে on আপনি কেবলমাত্র এই নির্দিষ্ট কাজের জন্য পৃথক 1-থ্রেড এক্সিকিউটার তৈরি করতে চাইতে পারেন, তবে এটি কোনও কিছুর জন্য অপেক্ষা করবে না। অথবা আপনার বর্তমান নির্বাহককে আরও থ্রেড দিন। অথবা এর কৌশল পরিবর্তন করুন।
Ordous

0

আসুন একটি সহজ প্রোগ্রাম লিখুন:

import java.util.concurrent.Executors
import java.util.concurrent.TimeUnit

var time = 0L
var start = System.currentTimeMillis()
val executor = Executors.newScheduledThreadPool(1)
executor.scheduleWithFixedDelay({
    if (time >= 12_000L) {
        executor.shutdown()
    } else {
        Thread.sleep(2000L)
        val now = System.currentTimeMillis()
        time += now - start
        System.out.println("Total $time delay ${now - start}\n")
        start = now
    }
}, 0L, 1000L, TimeUnit.MILLISECONDS)

এবং ফলাফলগুলি দেখুন:

| scheduleWithFixedDelay |   scheduleAtFixedRate  |
|:----------------------:|:----------------------:|
| Total 2001 delay 2001  | Total 2003 delay 2003  |
| Total 5002 delay 3001  | Total 4004 delay 2001  |
| Total 8003 delay 3001  | Total 6004 delay 2000  |
| Total 11003 delay 3000 | Total 8004 delay 2000  |
| Total 14003 delay 3000 | Total 10005 delay 2001 |
|          ---           | Total 12005 delay 2000 |

বিজ্ঞপ্তি কার্যকর করার সময় অপেক্ষা অপেক্ষা বড়

সময়সূচি উইথফিক্সডডিলে বিলম্বের
সময়সূচী রাখেএটি ফিক্সডরেট বিলম্ব সরিয়ে দেয়


-1
scheduledExecutorService.scheduleAtFixedRate(() -> {
        System.out.println("runnable start"); try { Thread.sleep(5000);  System.out.println("runnable end");} catch
     (InterruptedException e) { // TODO Auto-generated catch block
      e.printStackTrace(); }}, 2, 7, TimeUnit.SECONDS);



     scheduledExecutorService.scheduleWithFixedDelay(() -> {
     System.out.println("runnable start"); try { Thread.sleep(5000); System.out.println("runnable end");} catch
     (InterruptedException e) { // TODO Auto-generated catch block
     e.printStackTrace(); } }, 2, 7, TimeUnit.SECONDS);

কেবল এটি কার্যকর করুন, এবং আপনি পার্থক্যটি জানতে পারবেন। ধন্যবাদ


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