我尝试过延迟(或休眠)我的Java程序,但是出现了一个错误。

我无法使用Thread.sleep(x)或wait()。同样的错误信息出现:

interruptedexception;必须被捕获或宣布被丢弃。

在使用Thread.sleep()或wait()方法之前,是否需要任何步骤?


当前回答

使用java.util.concurrent.TimeUnit:

TimeUnit.SECONDS.sleep(1);

睡一秒钟或者

TimeUnit.MINUTES.sleep(1);

睡一分钟。

由于这是一个循环,这就提出了一个固有的问题-漂移。每次你运行代码然后睡觉的时候,你都会从运行中飘忽不定,比如说,每一秒。如果这是一个问题,那么不要使用睡眠。

此外,当涉及到控制时,睡眠不是很灵活。

对于每秒钟运行一个任务或在一秒延迟,我强烈建议[ScheduledExecutorService][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");
}

其他回答

放置你的线程。睡在一个尝试捕捉块

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

使用下面的编码结构来处理异常

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

Thread.sleep()对于初学者来说很简单,可能适用于单元测试和概念证明。

但是请不要在产品代码中使用sleep()。最终sleep()可能会狠狠地咬你一口。

多线程/多核java应用程序使用“线程等待”概念的最佳实践。Wait释放线程持有的所有锁和监控器,这允许其他线程获得这些监控器,并在您的线程平静睡眠时继续执行。

下面的代码演示了该技术:

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

当使用Android(我唯一一次使用Java)时,我会建议使用处理程序而不是让线程进入睡眠状态。

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

一种更简单的等待方法是使用System.currentTimeMillis(),它返回自UTC 1970年1月1日午夜以来的毫秒数。例如,等待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
}

这样,您就不必处理线程和异常。 希望这能有所帮助!