থ্রেড.স্লিপ (এক্স) বা অপেক্ষা () অপেক্ষা করার সময় আমি ব্যতিক্রম পেয়েছি


343

আমি আমার জাভা প্রোগ্রামটি বিলম্ব করার চেষ্টা করেছি - বা ঘুমিয়ে রেখেছি - তবে একটি ত্রুটি ঘটেছে।

আমি ব্যবহার করতে অক্ষম Thread.sleep(x)বা wait()। একই ত্রুটি বার্তা উপস্থিত হয়:

অপ্রত্যাশিত ব্যতিক্রম java.lang. অন্তর্ভুক্তপ্রবণতা; ধরা পড়তে হবে বা ছুঁড়ে ফেলার ঘোষণা করতে হবে।

পদ্ধতি Thread.sleep()বা wait()পদ্ধতিগুলি ব্যবহার করার আগে কি কোনও পদক্ষেপের প্রয়োজন আছে ?


8
ভাল, এটি জনপ্রিয়। প্রচুর সংখ্যক লোক অবশ্যই তাদের জাভা প্রোগ্রামটি কয়েক সেকেন্ডের জন্য বিলম্বিত করতে হবে। কল্পনা করা শক্ত। অবশ্যই, পোস্টটিতে সঠিক শিরোনাম স্থাপন করা প্রচুর পরিমাণে সহায়তা করবে।
রবার্ট হার্ভে

উত্তর:


575

আপনার সামনে অনেক পড়া আছে। ব্যতিক্রম হ্যান্ডলিং, থ্রেডিং এবং থ্রেড বাধা মাধ্যমে সংকলক ত্রুটিগুলি থেকে। তবে এটি আপনি যা চান তা করবে:

try {
    Thread.sleep(1000);                 //1000 milliseconds is one second.
} catch(InterruptedException ex) {
    Thread.currentThread().interrupt();
}

1
আপনার সহায়তার জন্য ধন্যবাদ, আমি এটি চালাতে সক্ষম হয়েছি .. পাশেই, ধরার জন্য কী ব্যবহার (বাধাপ্রাপ্তি প্রাক্তন)
ভিনসেন্ট কম

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

8
কিছু উত্তর ব্যতিক্রম কিছু না করতে বলে, কেউ কেউ নিক্ষেপ করতে বলে, এটি () বাধা দিতে বলে to কোনটি উপযুক্ত এবং কেন আলোচনার জন্য যত্ন নিতে হবে?
সুমা

6
@ সুমা এতে স্ট্যাক ওভারফ্লো নিজেই সহ প্রচুর আলোচনা। শুধু এটি অনুসন্ধান করুন। একটি মন্তব্য খুব দীর্ঘ। কয়েক বছর পরে, আমার কাছে একমাত্র উত্তর: এটি নির্ভর করে। সাধারণত আদর্শ সমাধান হ'ল থ্রেড সুদৃ .়ভাবে যা কিছু করছে তা শেষ করে দেওয়া (উদাহরণস্বরূপ, এই লেনদেনটি ফিরিয়ে দাও, একটি লুপ ভাঙা ইত্যাদি) তবে এটি অত্যন্ত প্রসঙ্গ নির্ভর।
কনরাড গারুস

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

195

অন্য ব্যবহারকারীরা যেমন বলেছেন যে আপনার কলটি একটি try{...} catch{...}ব্লক দিয়ে ঘিরে রাখা উচিত । তবে জাভা ১.২ প্রকাশিত হওয়ার পরে, টাইমউনিট ক্লাস রয়েছে যা থ্রেড.স্লিপ (মিলিস) এর মতো করে তবে আরও সুবিধাজনক। স্লিপ অপারেশনের জন্য আপনি সময় ইউনিট চয়ন করতে পারেন।

try {
    TimeUnit.NANOSECONDS.sleep(100);
    TimeUnit.MICROSECONDS.sleep(100);
    TimeUnit.MILLISECONDS.sleep(100);
    TimeUnit.SECONDS.sleep(100);
    TimeUnit.MINUTES.sleep(100);
    TimeUnit.HOURS.sleep(100);
    TimeUnit.DAYS.sleep(100);
} catch (InterruptedException e) {
    //Handle exception
}

এছাড়াও এটির অতিরিক্ত পদ্ধতি রয়েছে: টাইমউনিট ওরাকল ডকুমেন্টেশন


6
প্রয়োজনীয় try-catchব্যতিক্রম পরিচালনার সাথে কীভাবে এই কলগুলি ঘিরে রাখা যায় তার উদাহরণস্বরূপ অন্যান্য উত্তরগুলি দেখুন ।
তুলিল বাউরক

2
"Java.util.concurrent.TimeUnit আমদানি ভুলবেন না"
কোডার

29

কীভাবে এটি সঠিকভাবে করবেন তা সম্পর্কে এই দুর্দান্ত সংক্ষিপ্ত পোস্টটি দেখুন ।

মূলত: ধরা InterruptedException। মনে রাখবেন যে আপনাকে অবশ্যই এই ক্যাচ-ব্লকটি যুক্ত করতে হবে। পোস্টটি আরও খানিকটা ব্যাখ্যা করে।


13

ব্যতিক্রমগুলি পরিচালনা করতে নিম্নলিখিত কোডিং কনস্ট্রাক্ট ব্যবহার করুন

try {
  Thread.sleep(1000);
} catch (InterruptedException ie) {
    //Handle exception
}

8

আপনার Thread.sleepচেষ্টা করে দেখুন

try {
    //thread to sleep for the specified number of milliseconds
    Thread.sleep(100);
} catch ( java.lang.InterruptedException ie) {
    System.out.println(ie);
}

7

অ্যান্ড্রয়েড ব্যবহার করার সময় (আমি যখন জাভা ব্যবহার করি তখনই আমি) থ্রেডটি ঘুমানোর পরিবর্তে হ্যান্ডলার ব্যবহারের পরামর্শ দেব।

final Handler handler = new Handler();
    handler.postDelayed(new Runnable() {
        @Override
        public void run() {
            Log.i(TAG, "I've waited for two hole seconds to show this!");

        }
    }, 2000);

তথ্যসূত্র: http://developer.android.com/references/android/os/Handler.html


4
এটি কোর জাভার জন্য নয় অ্যান্ড্রয়েডের জন্য
গণেশ কৃষ্ণান

3

এটা চেষ্টা কর:

try{

    Thread.sleep(100);
}catch(Exception e)
{
   System.out.println("Exception caught");
}

8
Exceptionজাভাতে ধরা কি খারাপ অভ্যাস নয় ?
মাইকেল ডারস্ট

2
অন্যান্য উত্তরগুলির মতো এখানে আরও ভাল ধরা বাধাপ্রাপ্তি
ঘটে

6
এটিকে একটি 'পোকেমন ব্যতিক্রমী হ্যান্ডলার' বলা হয় - তাদের সকলকে ধরা পড়তে হবে।
জেমস টেলর

3

আমার জাভা প্রোগ্রামে বিলম্ব যুক্ত করার উপায়গুলি।

public void pause1(long sleeptime) {
    try {
        Thread.sleep(sleeptime);
    } catch (InterruptedException ex) {
        //ToCatchOrNot
    }
}

public void pause2(long sleeptime) {
    Object obj = new Object();
    if (sleeptime > 0) {
        synchronized (obj) {
            try {
                obj.wait(sleeptime);
            } catch (InterruptedException ex) {
                //ToCatchOrNot
            }
        }
    }
}
public void pause3(long sleeptime) {
    expectedtime = System.currentTimeMillis() + sleeptime;
    while (System.currentTimeMillis() < expectedtime) {
        //Empty Loop   
    }
}

এই অনুক্রমিক বিলম্বের জন্য কিন্তু লুপ জন্য বিলম্ব পড়ুন জাভা বিলম্ব / অপেক্ষা


দয়া করে নোট করুন যে নির্মম স্ব-প্রচার প্রচার এখানে অনুমোদিত নয়। সহায়তা কেন্দ্রে এখানে শেষ পয়েন্টটি দেখুন । তবে, আপনি আপনার প্রোফাইলে লিঙ্কটি রাখতে পারেন - এটি অনুমোদিত।
এসএল বার্থ - মনিকা

3
public static void main(String[] args) throws InterruptedException {
  //type code


  short z=1000;
  Thread.sleep(z);/*will provide 1 second delay. alter data type of z or value of z for longer delays required */

  //type code
}

উদাহরণ: -

class TypeCasting {

  public static void main(String[] args) throws InterruptedException {
    short f = 1;
    int a = 123687889;
    short b = 2;
    long c = 4567;
    long d=45;
    short z=1000;
    System.out.println("Value of a,b and c are\n" + a + "\n" + b + "\n" + c + "respectively");
    c = a;
    b = (short) c;
    System.out.println("Typecasting...........");
    Thread.sleep(z);
    System.out.println("Value of B after Typecasting" + b);
    System.out.println("Value of A is" + a);


  }
}

0

অপেক্ষা করার একটি সহজ উপায় হ'ল ব্যবহার করা System.currentTimeMillis(), যা 1 ই জানুয়ারি, 1970 ইউটিসির মধ্যরাত থেকে মিলি সেকেন্ডের সংখ্যা দেয়। উদাহরণস্বরূপ, 5 সেকেন্ড অপেক্ষা করতে:

public static void main(String[] args) {
    //some code
    long original = System.currentTimeMillis();
    while (true) {
        if (System.currentTimeMillis - original >= 5000) {
            break;
        }
    }
    //more code after waiting
}

এইভাবে, আপনাকে থ্রেড এবং ব্যতিক্রমগুলি নিয়ে উপহাস করতে হবে না। আশাকরি এটা সাহায্য করবে!


এটি অপেক্ষা করার সময় সিপিইউ গ্রহণ করে।
ইয়াক

@ ইয়্যাক এই সত্য, তবে এটি থ্রেড ব্যবহারের চেয়ে সহজ এবং খুব বেশি সিপিইউ ব্যবহার করে না।
স্যাম

0

ব্যবহার java.util.concurrent.TimeUnit:

TimeUnit.SECONDS.sleep(1);

এক সেকেন্ডের জন্য ঘুমাও বা

TimeUnit.MINUTES.sleep(1);

এক মিনিট ঘুমোও।

যেহেতু এটি একটি লুপ, এটি একটি অন্তর্নিহিত সমস্যা উপস্থাপন করে - প্রবাহিত। যতবার আপনি কোড চালান এবং তারপরে ঘুমান আপনি প্রতি সেকেন্ডে চলমান থেকে কিছুটা সরে যাবেন, বলুন। এটি যদি কোনও সমস্যা হয় তবে ব্যবহার করবেন না sleep

এছাড়াও, sleepএটি নিয়ন্ত্রণের ক্ষেত্রে খুব নমনীয় নয়।

প্রতি সেকেন্ডে কোনও কাজ চালানোর জন্য বা এক সেকেন্ড দেরিতে আমি জোরালোভাবে একটি [ ScheduledExecutorService] [1] এবং হয় [ scheduleAtFixedRate] [2] বা [scheduleWithFixedDelay ] [3] এর সুপারিশ করব।

myTaskপ্রতি সেকেন্ডে পদ্ধতিটি চালানোর জন্য (জাভা 8):

public static void main(String[] args) {
    final ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor();
    executorService.scheduleAtFixedRate(App::myTask, 0, 1, TimeUnit.SECONDS);
}

private static void myTask() {
    System.out.println("Running");
}

0

Thread.sleep() নতুনদের জন্য সহজ এবং ইউনিট পরীক্ষা এবং ধারণার প্রমাণগুলির জন্য উপযুক্ত হতে পারে।

তবে দয়া করে উত্পাদন কোডের জন্য ব্যবহার করবেন নাsleep() । অবশেষেsleep() আপনাকে খারাপভাবে কামড় দিতে পারে।

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

নীচের কোডটি সেই কৌশলটি দেখায়:

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());
    }
}

DelayUtil বাস্তবায়ন:

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 durationInMillis 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 void pause(int seconds){
    Date start = new Date();
    Date end = new Date();
    while(end.getTime() - start.getTime() < seconds * 1000){
        end = new Date();
    }
}

আপনি যখন এটি কল করবেন তখন এটি শুরু হয় এবং সেকেন্ডের সংখ্যা পেরিয়ে গেলে শেষ হয়।


7
এটি ঘুমের সময় সিপিইউ গ্রহণ করবে। থ্রেড.স্লিপ () এ থ্রেডটি নির্দিষ্ট করা যায়।
বিবেক পান্ডে

আপনি মুক্তি পেয়েছেন এবং কোনও জল নেই: ডি
এম 410

17
ব্যবহারকারী 2276378 প্রশ্নের ইংরাজিকে ভুল বুঝেছিল। ওপি বলেছিলেন যে তিনি "ঘুম ব্যবহার করতে বা অপেক্ষা করতে অক্ষম" যার ব্যবহারকারীর 2276378 অর্থ এই যে তারা তাদের ব্যবহার করতে পারবেন না (বা তাদের ব্যবহারের অনুমতি দেওয়া হয়নি) এবং তাই তিনি এমন একটি বৈধ সমাধান দিয়েছেন যা ঘুম বা অপেক্ষা করতে দেয় না। খুব কঠোর ইংরাজী না হওয়ার চেষ্টা করুন প্রত্যেকের প্রথম ভাষা নয়।
ডেভিড নিউকম্ব
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.