জাভা টাইমার বনাম এক্সিকিউটর সার্ভিস?


263

আমার কোড রয়েছে যেখানে আমি কোনও কাজটি শিডিউল ব্যবহার করে বলছি java.util.Timer। আমি চারপাশে তাকাচ্ছিলাম এবং দেখেছিও ExecutorServiceএকই কাজ করতে পারে। সুতরাং এই প্রশ্নটি এখানে, আপনি ব্যবহার করেছেন Timerএবং ExecutorServiceকাজের সময়সূচী করতে, একের অপরটি ব্যবহার করে কী লাভ?

এছাড়াও কেউ পরীক্ষা করতে চেয়েছিল যে কেউ Timerক্লাসটি ব্যবহার করেছে এবং কোন সমস্যার ExecutorServiceসমাধান করেছে যা তাদের জন্য সমাধান হয়েছে।


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

উত্তর:


313

অনুশীলনে জাভা কনকুরન્સી অনুসারে :

  • Timerসিস্টেম ঘড়ির পরিবর্তনের জন্য সংবেদনশীল হতে পারে, ScheduledThreadPoolExecutorতাই না।
  • Timerকেবলমাত্র একটি কার্যকর করার থ্রেড রয়েছে, তাই দীর্ঘ-চলমান টাস্কটি অন্যান্য কাজগুলিতে বিলম্ব করতে পারে। ScheduledThreadPoolExecutorযে কোনও সংখ্যক থ্রেড দিয়ে কনফিগার করা যায়। তদ্ব্যতীত, আপনি চান (সরবরাহ করে ThreadFactory) তৈরি করা থ্রেডগুলির উপর আপনার সম্পূর্ণ নিয়ন্ত্রণ রয়েছে ।
  • রানটাইম ব্যতিক্রমগুলি এই থ্রেডটিকে TimerTaskমেরে ফেলেছে , ফলে Timerমৃত হয়ে যায় :-( ... তফসিলযুক্ত কাজগুলি আর চলবে না run ScheduledThreadExecutorকেবল রানটাইম ব্যতিক্রমগুলিই ধরবে না , তবে আপনি যদি চান তবে এটি পরিচালনা করতে পারবেন (যে afterExecuteপদ্ধতি থেকে ওভাররাইডিং পদ্ধতিতে ThreadPoolExecutor) k নিক্ষেপ করা ব্যতিক্রম বাতিল করা হবে, তবে অন্যান্য কাজগুলি চলতে থাকবে।

আপনি যদি এর ScheduledThreadExecutorপরিবর্তে ব্যবহার করতে পারেন তবে এটি করুন Timer

আরও একটি জিনিস ... ScheduledThreadExecutorজাভা ১.৪ লাইব্রেরিতে উপলব্ধ না থাকলেও এখানে জেএসআর ১ 166 ( java.util.concurrent) এর জাভা 1.2, 1.3, 1.4 এর ব্যাকপোর্ট রয়েছে , যার ScheduledThreadExecutorক্লাস রয়েছে the


63

যদি এটি আপনার কাছে উপলব্ধ থাকে, তবে জাভা 5 এক্সিকিউটারের কাঠামোটি ব্যবহার না করার কারণ সম্পর্কে চিন্তা করা কঠিন । কল করা হচ্ছে:

ScheduledExecutorService ex = Executors.newSingleThreadScheduledExecutor();

আপনাকে ScheduledExecutorServiceঅনুরূপ কার্যকারিতা দিয়ে দেবে Timer(যেমন এটি একক থ্রেডযুক্ত হবে) তবে যার অ্যাক্সেসটি আরও বেশি স্কেলযোগ্য হতে পারে (হুডের নীচে এটি Timerশ্রেণীর সাথে সম্পূর্ণ সিঙ্ক্রোনাইজেশনের পরিবর্তে সমবর্তী কাঠামো ব্যবহার করে )। একটি ব্যবহার করে ScheduledExecutorServiceআপনাকে যেমন সুবিধা দেয়:

  • প্রয়োজন হলে আপনি এটি কাস্টমাইজ করতে পারেন ( শ্রেণিটি দেখুন newScheduledThreadPoolExecutor()বা দেখুন ScheduledThreadPoolExecutor)
  • 'এক অফ' মৃত্যুদন্ড কার্যকর করতে পারে ফলাফল

আটকে থাকার একমাত্র কারণ সম্পর্কে Timerআমি ভাবতে পারি:

  • এটি জাভা 5 এর আগে উপলব্ধ
  • জে এমএমইতে অনুরূপ ক্লাস সরবরাহ করা হয়েছে যা আপনার অ্যাপ্লিকেশনটির পোর্টিং সহজ করতে পারে (তবে এই ক্ষেত্রে বিমূর্ততার একটি সাধারণ স্তর যুক্ত করা মারাত্মকভাবে কঠিন হবে না)

1
ব্যবহারের আর একটি কারণ পদ্ধতির TimerTaskপ্রাপ্যতা হতে পারে scheduledExecutionTime()যা এর কোনও সমতুল্য বলে মনে হয় না ScheduledExecutorService
রোহিত আগরওয়াল

3
অন্য দ্রষ্টব্য: আমি 2k17 এ মন্তব্যটি লিখছি, J2ME আর নেই। এটা ইতিমধ্যে মারা গেছে।
মিসানজেল

1
জাভা টাইমার-ক্লাস কৃপণ।
জনিটেক্স

26

এক্সিকিউটর সার্ভিসেস আরও নতুন এবং আরও সাধারণ। একটি টাইমার হ'ল একটি থ্রেড যা পর্যায়ক্রমে আপনার জন্য নির্ধারিত জিনিসগুলি চালায় runs

একটি এক্সিকিউটর সার্ভিস থ্রেড পুল হতে পারে, বা এমনকি অন্য কোনও সিস্টেমে একটি ক্লাস্টারে ছড়িয়ে পড়ে এবং এক-অফ ব্যাচের কার্যকরকরণ ইত্যাদির মতো কাজ করে ...

প্রতিটি সিদ্ধান্ত নেওয়ার জন্য কী অফার করে তা দেখুন।


16

টাইমার ব্যবহারের আশেপাশে আরও কয়েকটি ভাল অভ্যাস এখানে রয়েছে:

http://tech.puredanger.com/2008/09/22/timer-rules/

সাধারণভাবে, আমি দ্রুত এবং নোংরা জিনিসগুলির জন্য টাইমার এবং আরও শক্তিশালী ব্যবহারের জন্য নির্বাহক ব্যবহার করতাম।


8

শিডিয়ুলথ্রেডপুলএক্সেকিউটারে ওরাকল ডকুমেন্টেশন পৃষ্ঠা থেকে

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

ExecutorService/ThreadPoolExecutorবা ScheduledThreadPoolExecutorআপনার একাধিক কর্মী থ্রেড থাকাকালীন স্পষ্ট পছন্দ।

ExecutorServiceওভার প্রসTimer

  1. TimerফোরকজাইনপুলেরExecutorService স্বাদ ব্যবহার করে বিশেষত একাধিক টাস্কেরExecutorService মতো নয় এমন সিপিইউ কোরগুলির সুবিধা নিতে পারে
  2. ExecutorServiceআপনার একাধিক কাজের মধ্যে সমন্বয় প্রয়োজন হলে সহযোগী এপিআই সরবরাহ করে। ধরে নিই যে আপনাকে এন নম্বর সংখ্যক কর্মীর কাজ জমা দিতে হবে এবং সেগুলি শেষ করার জন্য অপেক্ষা করতে হবে। আপনি সহজেই ইনভোকএল API এর মাধ্যমে এটি অর্জন করতে পারেন । আপনি যদি একাধিক Timerটাস্ক সহ একই অর্জন করতে চান তবে এটি সহজ হবে না।
  3. থ্রেডপুলএক্সেকটর থ্রেড লাইফ চক্র পরিচালনার জন্য আরও ভাল এপিআই সরবরাহ করে।

    থ্রেড পুলগুলি দুটি পৃথক সমস্যার সমাধান করে: প্রতি কার্য-অধিবেশন আহ্বান ওভারহেড হ্রাস করার কারণে তারা সাধারণত সংখ্যক অ্যাসিনক্রোনাস কার্য সম্পাদন করার সময় উন্নত কর্মক্ষমতা সরবরাহ করে এবং সংকলন সম্পাদন করার সময় তারা থ্রেড সহ সংস্থানগুলি সংস্থান এবং পরিচালনার একটি উপায় সরবরাহ করে কাজ. প্রতিটি থ্রেডপুলএক্সিকিউটর কিছু বেসিক পরিসংখ্যানও বজায় রাখে, যেমন সম্পন্ন কাজের সংখ্যা

    কয়েকটি সুবিধা:

    ক। আপনি থ্রেডগুলির জীবনচক্র তৈরি / পরিচালনা / নিয়ন্ত্রণ করতে পারেন এবং থ্রেড তৈরির ব্যয় ওভারহেডগুলি অনুকূল করতে পারেন

    খ। আপনি কার্যগুলির প্রক্রিয়াজাতকরণ (ওয়ার্ক স্টিলিং, ফর্কজইনপুল, ইনভোকএল) ইত্যাদি নিয়ন্ত্রণ করতে পারেন etc.

    গ। আপনি থ্রেডের অগ্রগতি এবং স্বাস্থ্য নিরীক্ষণ করতে পারেন

    ঘ। আরও ভাল ব্যতিক্রম পরিচালনার ব্যবস্থা সরবরাহ করে


5

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

তুলনা করা

private final ThreadFactory threadFactory = new ThreadFactory() {
    public Thread newThread(Runnable r) {
        Thread t = new Thread(r);
        t.setDaemon(true);
        return t;
    }
};
private final ScheduledExecutorService timer = Executors.newSingleThreadScheduledExecutor(threadFactory); 

সঙ্গে

private final Timer timer = new Timer(true);

আমি যখন এক্সিকিউটর সার্ভিসের দৃ of়তার প্রয়োজন না হয় তখন আমি এটি করি do

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