source

스레드 사용 시 예외가 발생합니다.sleep(x) 또는 wait()

gigabyte 2022. 11. 28. 21:10
반응형

스레드 사용 시 예외가 발생합니다.sleep(x) 또는 wait()

Java 프로그램을 지연시키거나 sleeve 상태로 전환하려고 했지만 오류가 발생했습니다.

이 안 돼요.Thread.sleep(x) ★★★★★★★★★★★★★★★★★」wait()

보고되지 않은 예외 java.disples.중단됨예외. 반드시 잡거나 투척을 선언해야 합니다.

요?Thread.sleep() ★★★★★★★★★★★★★★★★★」wait()방??

당신은 앞으로 읽을 것이 많아요.예외 처리, 스레드화 및 스레드화 중단에 이르기까지 컴파일러 오류로부터.하지만 이렇게 하면 원하는 대로 할 수 있습니다.

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

하셨듯이, 를 「보다」로 둘러싸야 .try{...} catch{...}블록입니다. 하지만 자바 1.5가 출시되었기 때문에 스레드와 동일한 TimeUnit 클래스가 있습니다.수면(밀리)이 더 편리합니다.수면 조작을 위한 시간 단위를 선택할 수 있습니다.

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
}

또한 다음과 같은 추가 메서드가 있습니다.TimeUnit Oracle 문서

이것을 올바르게 하는 방법에 관한 이 훌륭한 간단한 투고를 봐 주세요.

기본적으로: catch the. 이 catch-block을 추가해야 합니다.그 게시물은 이것을 조금 더 자세히 설명한다.

예외를 처리하려면 다음 코딩 구성 사용

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

말을 써라.Thread.sleep

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

Android(Java를 사용하는 유일한 경우)를 사용할 때는 스레드를 sleep 상태로 하는 대신 핸들러를 사용하는 것을 추천합니다.

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/reference/android/os/Handler.html

이것을 시험해 보세요.

try{

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

자바 프로그램에 지연을 추가하는 방법

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   
    }
}

이는 순차 지연에 대한 것이지만 루프 지연에 대한 내용은 Java Delay/Wait를 참조하십시오.

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


  }
}

은 '기다리다'를 사용하는 입니다.System.currentTimeMillis()1일 밀리초수를 '5'는 '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
}

이렇게 하면, 당신은 실과 예외를 가지고 장난칠 필요가 없습니다.이게 도움이 됐으면 좋겠네요!

java.util.concurrent.TimeUnit:

TimeUnit.SECONDS.sleep(1);

1초만 자거나

TimeUnit.MINUTES.sleep(1);

잠깐 주무세요.

이것이 루프이기 때문에, 이것은 본질적인 문제인 드리프트를 일으킵니다.코드를 실행하고 나서 잘 때마다, 예를 들어 매초마다 조금씩 달리기에서 표류하게 됩니다.가 있는 는, 「일부러」를 하지 말아 주세요sleep.

,,sleep통제에 관해서는 그다지 유연하지 않습니다.

작업을 매초 또는 1초 지연으로 실행할 경우 []를 강력히 권장합니다.ScheduledExecutorService[1] 및 [1] 중 하나scheduleAtFixedRate] [ 2 ]또는 [ ]scheduleWithFixedDelay][3].

메서드를 실행하려면myTask매초(Java 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");
}

Thread.sleep()초보자용 심플하고 유닛 테스트 및 개념 증명에 적합합니다.

그러나 사용하지 마십시오.sleep()제품 코드의 경우.결국.sleep()심하게 물릴 수도 있어요

멀티스레드/멀티코어 Java 응용 프로그램에서 "스레드 대기" 개념을 사용하는 모범 사례입니다.Wait는 스레드에 의해 유지되는 모든 잠금 및 모니터를 해제하여 스레드가 평화롭게 sleeve 상태일 때 다른 스레드가 해당 모니터를 획득할 수 있도록 합니다.

다음 코드는 이 기술을 보여줍니다.

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

또는 스레드를 취급하지 않는 경우는, 다음의 방법을 사용해 주세요.

public static void pause(int seconds){
    Date start = new Date();
    Date end = new Date();
    while(end.getTime() - start.getTime() < seconds * 1000){
        end = new Date();
    }
}

호출할 때 시작하여 초수가 경과하면 종료됩니다.

언급URL : https://stackoverflow.com/questions/3342651/i-get-exception-when-using-thread-sleepx-or-wait

반응형