জাভাতে টাইমার কীভাবে সেট করবেন?


151

একটি টাইমার কীভাবে সেট করবেন, 2 মিনিটের জন্য বলুন, কোনও ডেটাবেসে কানেক্ট করার চেষ্টা করার পরে যদি কোনও সংযোগ আছে তবে ব্যতিক্রম নিক্ষেপ করবেন?


1
কমপক্ষে 2 মিনিটের জন্য অ্যাকশনটির সহজ প্রচেষ্টা করতে ইচ্ছুক হলে ওপি স্পষ্টভাবে কল করুন, বা যদি এখনই এই ব্যতিক্রমটি এখন দুই মিনিটের পরে নিক্ষেপ করতে হবে, যদিও সংযোগ দেওয়ার চেষ্টা
চলমান রয়েছে

উত্তর:


280

সুতরাং উত্তরের প্রথম অংশটি হ'ল বিষয়টি যা জিজ্ঞাসা করে তা কীভাবে করা যায় কারণ আমি প্রাথমিকভাবে এটির ব্যাখ্যা কীভাবে করেছি এবং কয়েকটি লোক সহায়ক বলে মনে হয়েছিল। প্রশ্নটি তখন থেকেই স্পষ্ট হয়েছিল এবং আমি সেই উত্তরটির উত্তরটি প্রসারিত করেছি।

একটি টাইমার সেট করা হচ্ছে

প্রথমে আপনাকে একটি টাইমার তৈরি করতে হবে (আমি java.utilএখানে সংস্করণটি ব্যবহার করছি ):

import java.util.Timer;

..

Timer timer = new Timer();

একবার কাজটি চালানোর জন্য:

timer.schedule(new TimerTask() {
  @Override
  public void run() {
    // Your database code here
  }
}, 2*60*1000);
// Since Java-8
timer.schedule(() -> /* your database code here */, 2*60*1000);

আপনি যে সময়কালটি করবেন তার পরে টাস্কটি পুনরাবৃত্তি করতে:

timer.scheduleAtFixedRate(new TimerTask() {
  @Override
  public void run() {
    // Your database code here
  }
}, 2*60*1000, 2*60*1000);

// Since Java-8
timer.scheduleAtFixedRate(() -> /* your database code here */, 2*60*1000, 2*60*1000);

একটি টাস্ক সময়সীমা তৈরি করা

স্পষ্ট প্রশ্নটি যা নির্দিষ্ট সময়ের জন্য কোনও কাজ সম্পাদনের চেষ্টা করছে তা স্পষ্টভাবে করার জন্য, আপনি নিম্নলিখিতটি করতে পারেন:

ExecutorService service = Executors.newSingleThreadExecutor();

try {
    Runnable r = new Runnable() {
        @Override
        public void run() {
            // Database task
        }
    };

    Future<?> f = service.submit(r);

    f.get(2, TimeUnit.MINUTES);     // attempt the task for two minutes
}
catch (final InterruptedException e) {
    // The thread was interrupted during sleep, wait or join
}
catch (final TimeoutException e) {
    // Took too long!
}
catch (final ExecutionException e) {
    // An exception from within the Runnable task
}
finally {
    service.shutdown();
}

যদি কার্যটি 2 মিনিটের মধ্যে শেষ হয় তবে ব্যতিক্রমগুলি সহ এটি সাধারণত সম্পাদন করে। যদি এটি এর চেয়ে বেশি সময় চালায় তবে টাইমআউট এক্সেপশন নিক্ষেপ করা হবে।

একটি বিষয় হ'ল আপনি যদি দুই মিনিটের পরে একটি সময়সীমা গ্রহণ করেন তবে কার্যটি আসলে চলতে থাকবে , যদিও সম্ভবত কোনও ডাটাবেস বা নেটওয়ার্ক সংযোগ শেষ পর্যন্ত সময় হয়ে যায় এবং থ্রেডে একটি ব্যতিক্রম ছুঁড়ে ফেলবে। তবে সচেতন থাকুন এটি হওয়া পর্যন্ত এটি সংস্থানগুলি গ্রাস করতে পারে।


ওহ আমি অনুমান করি আপনি আমার সমস্যাটি ভুল করে ফেলেছেন, আমাকে বারবার 2 মিনিট অবধি ডাটাবেসে সংযোগ করার চেষ্টা করতে হবে
অঙ্কিতা

আমি দুঃখিত, তবে আমার প্রয়োজনটি হ'ল আমি ডাটাবেসটিতে সংযোগ স্থাপনের জন্য 2 মিনিট সময় দিতে চাই এবং তারপরে এটি কিছু ত্রুটি বার্তা ফেলে দেবে tএর ​​মতো আমি ডাটাবেসটিতে সংযোগ স্থাপনের জন্য সময়সীমা নির্ধারণ করতে চাই
অঙ্কিতা

7
পাঠকরা সাবধান: এই উত্তরটি স্পষ্টতই ভুল। এটি 2 মিনিট অপেক্ষা করার জন্য একটি টাইমার সেট করে এবং তারপরে 2 মিনিটের বিলম্বের পরে একটি ডিবি কোয়েরি চালায় এবং তারপরে এটি প্রতি 2 মিনিটে বারবার চালায়। এটি যা করে না তা হ'ল ডিবি কোয়েরিটি এখনই চালানো, এবং তারপরে 2 মিনিটের পরে ব্যর্থ হয়ে যায় যা আমি মনে করি যে প্রশ্নটি জিজ্ঞাসা করেছিল (মন্তব্যে স্পষ্ট করে দেওয়া হয়েছে)।
AgilePro

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

1
@ এরনেস্টাস গ্রুডিস মূল এপিআইগুলি নির্মাতাকে সর্বজনীন হিসাবে তালিকাবদ্ধ করে : docs.oracle.com/javase/7/docs/api/java/util/Timer.html#Timer () আপনার ক্লাসপথে আপনার আলাদা টাইমার ক্লাস থাকতে পারে - জাভা চেষ্টা করুন। use.Timer ক্লাস হিসাবে।
অ্যান্ড্রুমু

25

এটা ব্যবহার কর

long startTime = System.currentTimeMillis();
long elapsedTime = 0L.

while (elapsedTime < 2*60*1000) {
    //perform db poll/check
    elapsedTime = (new Date()).getTime() - startTime;
}

//Throw your exception

1
হুম ... এটি প্রযুক্তিগতভাবে কাজ করবে, যদি না এটি প্রান্তের মামলাগুলি কভার করে না, যেখানে আপনি একটি ডিবি জরিপ
চালিয়ে যাচ্ছেন,

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

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

ধরা যাক আপনাকে হয় সংযোগটি ফিরিয়ে দিতে হবে বা প্রায় দুই মিনিট পরে নিক্ষেপ করতে হবে, এটি কার্যকর হবে না। এটি যদি সংযোগের চেষ্টা করার দুই মিনিট পরেও আপনি এখনও সংযোগ করতে ব্যর্থ হন। এমন পরিস্থিতিতে যেখানে সংযোগ চেকটি দুই সপ্তাহ বলে, এটি ব্যতিক্রম করতে দীর্ঘ সময় নিতে পারে।
thecoshman

14
এটি আসলে খুব খারাপ কোডিং শৈলী, যেহেতু লুপটি অবিচ্ছিন্নভাবে চালিত হয় এবং স্টাফগুলির জন্য পরীক্ষা করে ... সিপিইউর পক্ষে খারাপ না এবং ব্যাটারির আয়ুষ্কাল সময়ের জন্য খারাপ।
অনন্ত

11

ঠিক আছে, আমি মনে করি আমি এখন আপনার সমস্যাটি বুঝতে পারি। কিছু করার চেষ্টা করার জন্য আপনি ভবিষ্যতটি ব্যবহার করতে পারেন এবং কিছু না ঘটলে কিছুক্ষণ পরেই সময়সীমা নির্ধারণ করতে পারেন।

উদাহরণ:

FutureTask<Void> task = new FutureTask<Void>(new Callable<Void>() {
  @Override
  public Void call() throws Exception {
    // Do DB stuff
    return null;
  }
});

Executor executor = Executors.newSingleThreadScheduledExecutor();
executor.execute(task);

try {
  task.get(5, TimeUnit.SECONDS);
}
catch(Exception ex) {
  // Handle your exception
}

ব্যতিক্রম ছুঁড়ে দেওয়া হয়েছে তবে প্রোগ্রামটি শেষ হচ্ছে না lease দয়া করে এর মাধ্যমে আমাকে সহায়তা করুন।
অঙ্কিতা

2
আপনি এক্সিকিউটারের পরিবর্তে এক্সিকিউটর সার্ভিস ক্লাস ব্যবহার করতে পারেন। এক্সিকিউটারকে থামানোর জন্য এটিতে শাটডাউন () পদ্ধতি রয়েছে।
রাইটের

1
এক্সিকিউটররা নিক্ষিপ্ত ব্যতিক্রমগুলি গিলে ফেলবে যা আপনি বিশেষভাবে আপনার কলযোগ্য / চলমান ক্ষেত্রে হ্যান্ডেল করেন না। যদি আপনার চলমান / কলযোগ্য ব্যতিক্রমটি নিজেই ধরে না এবং পরিচালনা করে না এবং এটি আপনার নিজের মালিকানাধীন আপনার সরবরাহ করা হয়, তবে আপনাকে শিডিউডএকসিকিউটারস সার্ভিসটিকে সাবক্লাস করতে হবে এবং এক্সেকিউটের পরে ওভাররাইড করতে হবে (সুপার.অ্যাক্টেক্সট () কল করতে ভুলবেন না)। AfterExecute দ্বিতীয় যুক্তি থেকে runnable / Callable নিক্ষেপযোগ্য হতে হবে
আদম

3
    new java.util.Timer().schedule(new TimerTask(){
        @Override
        public void run() {
            System.out.println("Executed...");
           //your code here 
           //1000*5=5000 mlsec. i.e. 5 seconds. u can change accordngly 
        }
    },1000*5,1000*5); 

কেবল কোডের উপরে কীটপত্রে অনুলিপি করুন এটি ভাল কাজ করবে। আমি দুটি বার 'সময়' দিয়েছি প্রথমবার এই কোডটি কার্যকর করার জন্য এবং দ্বিতীয়টি অন্তর সময়ের জন্য।
মহাদেব

টাইমারের জন্য ডকুমেন্টেশন পরিবর্তে এক্সিকিউটার ফ্রেমওয়ার্ক ব্যবহার করার পরামর্শ দেয়। docs.oracle.com/javase/10/docs/api/java/util/Timer.html
করণ খান্না

1

[অ্যান্ড্রয়েড] যদি কেউ জাভা ব্যবহার করে অ্যান্ড্রয়েডে টাইমার প্রয়োগ করতে চান ।

ক্রিয়াকলাপ সম্পাদনের জন্য আপনার মতো ইউআই থ্রেড ব্যবহার করা দরকার ।

Timer timer = new Timer();
timer.schedule(new TimerTask() {
           @Override
            public void run() {
                ActivityName.this.runOnUiThread(new Runnable(){
                    @Override
                      public void run() {
                       // do something
                      }        
                });
            }
        }, 2000));
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.