জাভা: নির্দিষ্ট সেকেন্ডের পরে একটি ফাংশন চালান


148

আমার একটি নির্দিষ্ট ফাংশন রয়েছে যা আমি 5 সেকেন্ড পরে কার্যকর করতে চাই। আমি জাভাতে কীভাবে এটি করতে পারি?

আমি javax.swing.timer পেয়েছি, তবে কীভাবে এটি ব্যবহার করব তা আমি সত্যি বুঝতে পারি না। দেখে মনে হচ্ছে আমি কিছু সহজ উপায় খুঁজছি তবে এই শ্রেণিটি সরবরাহ করে।

একটি সাধারণ ব্যবহার উদাহরণ যোগ করুন।


আপনি কি 5 সেকেন্ড অপেক্ষা করতে চান এবং তারপরে কিছু কার্যকর করতে চান বা আপনি 5 সেকেন্ডে অন্য কিছু করা চালিয়ে যেতে চান?
হুইস্কিসিয়ার

আমি অন্য কিছু করা চালিয়ে যেতে চাই
ufk

উত্তর:


229
new java.util.Timer().schedule( 
        new java.util.TimerTask() {
            @Override
            public void run() {
                // your code here
            }
        }, 
        5000 
);

সম্পাদনা করুন:

জাভাদোক বলেছেন:

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


1
আপনি যদি এই কোডটি চালান, আপনি থ্রেড ফাঁস করবেন। আপনার কাজ শেষ হয়ে গেলে টাইমার পরিষ্কার করার বিষয়টি নিশ্চিত করুন।
স্কাফম্যান

1
@ স্কাফম্যান: জাভাদোক থেকে আমি একটি বিবৃতি যুক্ত করেছি। সময়সূচী কল করার পরে আপনার কি সত্যিই পরিষ্কার করতে হবে?
টাঞ্জেন

1
এটি ঠিক হতে পারে, তবে তারপরেও এটি নাও হতে পারে। আপনি যদি সেই কোড টুকরাটি একাধিকবার চালান তবে আপনার কাছে looseিলে threadsালা থ্রেডগুলি লাথি মারার কোনও উপায় নেই them
স্কাফম্যান

5
import java.util.Timer; import java.util.TimerTask;এটি আরও স্পষ্ট করে তুলতে পারে যে এটি নয় javax.swing.Timer। / দ্রষ্টব্য, আপনি যদি সুইং ব্যবহার করছেন (এবং আসলে এডাব্লুটি) আপনার অ-ইভেন্ট ডিসপ্যাচ থ্রেড (EDT) থ্রেডগুলিতে উপাদানগুলি পরিবর্তন করার জন্য কিছু করা উচিত নয় ( java.util.Timerকার্যগুলি খারাপ; javax.swing.Timerক্রিয়াগুলি ভাল)।
টম হাটিন -

2
@ পল অ্যালেক্সান্দার ডক্স অনুসারে - cancelরান পদ্ধতির শেষে টাইমার পদ্ধতি কল করা টাইমারটাস্কের কার্যকরকরণের থ্রেড সাফ করবে।
ডান্ডালফ

58

এটার মতো কিছু:

// When your program starts up
ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();

// then, when you want to schedule a task
Runnable task = ....    
executor.schedule(task, 5, TimeUnit.SECONDS);

// and finally, when your program wants to exit
executor.shutdown();

Executorআপনি যদি পুলটিতে আরও থ্রেড চান তবে অন্যান্য বিভিন্ন কারখানার পদ্ধতি রয়েছে যার পরিবর্তে আপনি ব্যবহার করতে পারেন।

এবং মনে রাখবেন, সমাপ্তির পরে নির্বাহককে শাটডাউন করা জরুরী। shutdown()পদ্ধতি পরিচ্ছন্নভাবে থ্রেড পুল বন্ধ হবে যখন শেষ টাস্ক সম্পন্ন করেছে, এবং যতক্ষণ এই ঘটনার অবরুদ্ধ করবে। shutdownNow()তাত্ক্ষণিকভাবে থ্রেড পুলটি শেষ করে দেবে।


24

ব্যবহারের উদাহরণ javax.swing.Timer

Timer timer = new Timer(3000, new ActionListener() {
  @Override
  public void actionPerformed(ActionEvent arg0) {
    // Code to be executed
  }
});
timer.setRepeats(false); // Only execute once
timer.start(); // Go go go!

এই কোডটি কেবল একবার কার্যকর করা হবে এবং 3000 এমএস (3 সেকেন্ড) এ কার্যকর করা হবে।

ক্যামিকার যেমন উল্লেখ করেছেন, আপনার একটি সংক্ষিপ্ত পরিচিতির জন্য " সুইং টাইমারগুলি কীভাবে ব্যবহার করবেন " দেখুন।


6

আমার কোডটি নিম্নরূপ:

new java.util.Timer().schedule(

    new java.util.TimerTask() {
        @Override
        public void run() {
            // your code here, and if you have to refresh UI put this code: 
           runOnUiThread(new   Runnable() {
                  public void run() {
                            //your code

                        }
                   });
        }
    }, 
    5000 
);

5

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

Timer t = new java.util.Timer();
t.schedule( 
        new java.util.TimerTask() {
            @Override
            public void run() {
                // your code here
                // close the thread
                t.cancel();
            }
        }, 
        5000 
);

এটি কোনও অভ্যন্তর শ্রেণীর ভিতরে প্রবেশ করার কারণে এটি Timer tঘোষণা করা উচিত নয় final?
জোশুয়া পিন্টার

1
@ জোশুয়াপিন্টার হ্যাঁ, এটি চূড়ান্ত ঘোষণা করা উচিত তবে কমপক্ষে জাভা 8 এ এটি স্পষ্টভাবে চূড়ান্তভাবে ঘোষণা করার দরকার নেই এটি কেবল "কার্যকরভাবে চূড়ান্ত" হওয়া দরকার ( জাভেরভিসিটেড.ব্লগস্পট.কম /5 / 03/… )
ডান্ডালফ

4

আপনার মূল প্রশ্নটিতে "সুইং টাইমার" উল্লেখ রয়েছে। বাস্তবে যদি আপনার প্রশ্নটি সুইডিংয়ের সাথে সম্পর্কিত হয়, তবে আপনার উচিত সুইং টাইমার ব্যবহার করা উচিত এবং এটি ব্যবহারকারীর নয় ime টাইমার।

আরও তথ্যের জন্য " টাইমার কীভাবে ব্যবহার করবেন " শীর্ষক টিউটোরিয়াল থেকে সুইং টিউটোরিয়ালটি পড়ুন ।


4

আপনি থ্রেড.স্লিপ () ফাংশনটি ব্যবহার করতে পারেন

Thread.sleep(4000);
myfunction();

আপনার ফাংশন 4 সেকেন্ড পরে কার্যকর করা হবে। তবে এটি পুরো প্রোগ্রামটি বিরতি দিতে পারে ...


এবং এটি কেবল গ্যারান্টি দেয় যে কার্যকরকরণটি 4 সেকেন্ড পরে চলবে, যার অর্থ 10 সেকেন্ড পরেও হতে পারে!
কোয়েস্টজেন

2
কোয়েস্টজেন, আপনি দেখতে পাবেন যে এখানে সমস্ত পদ্ধতি এটি করে। বাস্তবে, আপনি ওএস পর্যায়ে কিছু নির্ধারণ করার পরেও, আপনি সাধারণত কোনও ইভেন্টের আগে কেবল সর্বনিম্ন সময়কে গ্যারান্টি দিতে পারেন।
ইথান

প্রকৃত প্রশ্নটি এটিই নয়
ইন্দার আর সিং

আমাকে কেবল এটিকে একটি ডাউনওয়েট দিতে হয়েছিল - হাতে থাকা প্রশ্নের কোনও উত্তর নেই।
মায়ার

ওপি একটি মন্তব্যে বলেছিলেন "আমি অন্য কিছু করা চালিয়ে যেতে চাই"; এই কোড স্পষ্টতই, না।
অভিজিৎ সরকার

3

ScheduledThreadPoolExecutor এই ক্ষমতা আছে, কিন্তু এটি বেশ ভারী ওজন।

Timer এছাড়াও এই ক্ষমতা রয়েছে তবে শুধুমাত্র একবার ব্যবহার করা হলেও বেশ কয়েকটি থ্রেড খোলে।

এখানে একটি পরীক্ষা (অ্যান্ড্রয়েডের হ্যান্ডলারের পোস্টারডেস্টেডের কাছাকাছি স্বাক্ষর ) এর সাথে একটি সাধারণ বাস্তবায়ন রয়েছে :

public class JavaUtil {
    public static void postDelayed(final Runnable runnable, final long delayMillis) {
        final long requested = System.currentTimeMillis();
        new Thread(new Runnable() {
            @Override
            public void run() {
                // The while is just to ignore interruption.
                while (true) {
                    try {
                        long leftToSleep = requested + delayMillis - System.currentTimeMillis();
                        if (leftToSleep > 0) {
                            Thread.sleep(leftToSleep);
                        }
                        break;
                    } catch (InterruptedException ignored) {
                    }
                }
                runnable.run();
            }
        }).start();
    }
}

টেস্ট:

@Test
public void testRunsOnlyOnce() throws InterruptedException {
    long delay = 100;
    int num = 0;
    final AtomicInteger numAtomic = new AtomicInteger(num);
    JavaUtil.postDelayed(new Runnable() {
        @Override
        public void run() {
            numAtomic.incrementAndGet();
        }
    }, delay);
    Assert.assertEquals(num, numAtomic.get());
    Thread.sleep(delay + 10);
    Assert.assertEquals(num + 1, numAtomic.get());
    Thread.sleep(delay * 2);
    Assert.assertEquals(num + 1, numAtomic.get());
}

এটি একটি লুপে ডাকা সতর্কতা ঘুম দেয়
শরিফ

whileশুধু বাধা উপেক্ষা করার নয়।
অ্যালিকেলজিন-কিলাকা

2

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

নীচের কোডটি সেই কৌশলটি দেখায়। মনে রাখবেন এটি java.util.Timer হুডের নীচে যা করে তবে এর চেয়ে বেশি হালকা to

import java.util.concurrent.TimeUnit;
public class DelaySample {
    public static void main(String[] args) {
       DelayUtil d = new DelayUtil();
       System.out.println("started:"+ new Date());
       d.delay(500);
       System.out.println("half second after:"+ new Date());
       d.delay(1, TimeUnit.MINUTES); 
       System.out.println("1 minute after:"+ new Date());
    }
}

বিলম্বযন্ত্র বাস্তবায়ন

import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;

public class DelayUtil {
    /** 
    *  Delays the current thread execution. 
    *  The thread loses ownership of any monitors. 
    *  Quits immediately if the thread is interrupted
    *  
    * @param duration the time duration in milliseconds
    */
   public void delay(final long durationInMillis) {
      delay(durationInMillis, TimeUnit.MILLISECONDS);
   }

   /** 
    * @param duration the time duration in the given {@code sourceUnit}
    * @param unit
    */
    public void delay(final long duration, final TimeUnit unit) {
        long currentTime = System.currentTimeMillis();
        long deadline = currentTime+unit.toMillis(duration);
        ReentrantLock lock = new ReentrantLock();
        Condition waitCondition = lock.newCondition();

        while ((deadline-currentTime)>0) {
            try {
                lock.lockInterruptibly();    
                waitCondition.await(deadline-currentTime, TimeUnit.MILLISECONDS);
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
                return;
            } finally {
                lock.unlock();
            }
            currentTime = System.currentTimeMillis();
        }
    }
}

2
public static Timer t;

public synchronized void startPollingTimer() {
        if (t == null) {
            TimerTask task = new TimerTask() {
                @Override
                public void run() {
                   //Do your work
                }
            };

            t = new Timer();
            t.scheduleAtFixedRate(task, 0, 1000);
        }
    }

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