精华内容
下载资源
问答
  • JAVA后台时间等待JAVA中实现让程序等待一段时间的方法,JAVA中想让代码等待一段时间再继续执行,可以通过让当前线程睡眠一段时间的方式。1.通过线程的sleep方法try {Thread.currentThread().sleep(1000);//等待1秒} ...

    JAVA后台时间等待

    JAVA中实现让程序等待一段时间的方法,JAVA中想让代码等待一段时间再继续执行,可以通过让当前线程睡眠一段时间的方式。

    1.通过线程的sleep方法

    try {

    Thread.currentThread().sleep(1000);//等待1秒

    } catch (InterruptedException e) {

    e.printStackTrace();

    }

    在需要程序等待的地方加入这个语句,实现让程序等待,这里的参数1000是以毫秒为单位,即这语句可以让程序等待1秒。

    2.通过Thread.sleep

    try {

    for(int i=1;i<6;i++) {

    Thread.sleep(2000);//等待2秒

    }

    } catch (InterruptedException e){

    e.printStackTrace();

    }

    3.TimeUnit类里的sleep方法

    TimeUnit.DAYS.sleep(1);//天

    TimeUnit.HOURS.sleep(1);//小时

    TimeUnit.MINUTES.sleep(1);//分

    TimeUnit.SECONDS.sleep(1);//秒

    TimeUnit.MILLISECONDS.sleep(1000);//毫秒

    TimeUnit.MICROSECONDS.sleep(1000);//微妙

    TimeUnit.NANOSECONDS.sleep(1000);//纳秒

    try {

    for(int i=1;i<6;i++) {

    TimeUnit.SECONDS.sleep(3);//等待3秒

    }

    } catch (InterruptedException e){

    e.printStackTrace();

    }

    TimeUnit类提供的方法,其实底层调用的也是Thread类的sleep方法,让程序进行等待。只不过他在上层根据时间单位进行了封装,如上图,共有7种可以选择,可以方便的选择自己需要的时间单位进行使用。

    html页面时间等待

    1.通过html meta实现

    跳转...

    释义:content="3,url=IndexServlet" 中3是指延迟3秒。

    2.通过setInterval实现

    通过setInterval函数,来周期性的更新倒计时间,同时更新到页面。页面上的显示效果是3 2 1,然后跳转到index.html

    3

    setInterval(jump,1000);

    var sec = 3;

    function jump(){

    sec--;

    if(sec > 0){

    document.getElementById('remainSeconds').innerHTML = sec;

    }else{

    window.location.href = 'index.html';

    }

    }

    通过setTimeout执行一个延迟函数来达到跳转的目的

    setTimeout(jump,3000);

    function jump(){

    window.location.href='IndexServlet';

    }

    3.通过setTimeout实现

    通过setTimeout 函数,来周期性的更新倒计时间,同时更新到页面。页面上的显示效果是3 2 1,然后跳转到index.html

    3

    var sec = 3;

    function jump(){

    sec--;

    if(sec > 0){

    document.getElementById('remainSeconds').innerHTML = sec;

    setTimeout(this.jump,1000);

    }else{

    window.location.href = 'index.html';

    }

    }

    setTimeout(jump,1000);

    展开全文
  • JAVA中实现程序等待一段时间的方法 JAVA中想让代码等待一段时间再继续执行,可以通过让当前线程睡眠一段时间的方式。 出发点在于:公司有两个服务器,分布式定时任务只是在一个服务器上面运行,为了在服务器进行轮询...

    JAVA中实现程序等待一段时间的方法

    JAVA中想让代码等待一段时间再继续执行,可以通过让当前线程睡眠一段时间的方式。
    出发点在于:公司有两个服务器,分布式定时任务只是在一个服务器上面运行,为了在服务器进行轮询执行分布式定时任务,采用了ElasticJob进行分片处理.
    出现的问题:当两个服务器执行的时间几乎一致时,多线程执行的时候,后进来的线程拿到了前线程修改的值.(线程进来时会与redis的值进行匹配,值不相同就直接return)
    处理方式:延长下代码的执行时间

    在这里插入图片描述

    方法一:通过线程的sleep方法。

    Thread.currentThread().sleep(1000);
    

    在需要程序等待的地方加入这个语句,实现让程序等待,这里的参数1000是以毫秒为单位,即这语句可以让程序等待1秒。

    方法二:TimeUnit类里的sleep方法。

    TimeUnit.DAYS.sleep(1);*//天*
    TimeUnit.HOURS.sleep(1);//小时
    TimeUnit.MINUTES.sleep(1);//分
    TimeUnit.SECONDS.sleep(1);//秒
    TimeUnit.MILLISECONDS.sleep(1000);//毫秒
    TimeUnit.MICROSECONDS.sleep(1000);//微妙
    TimeUnit.NANOSECONDS.sleep(1000);//纳秒
    

    TimeUnit类提供的方法,其实底层调用的也是Thread类的sleep方法,让程序进行等待。只不过他在上层根据时间单位进行了封装,如上图,共有7种可以选择,可以方便的选择自己需要的时间单位进行使用。

    展开全文
  • 这是篇走心的填坑笔记,自学Java的几年总是在不断学习新的技术,一路走来发现自己踩坑无数,而填上的坑却屈指可数。突然发现,有时候真的不是几年工作经验的问题,有些东西即使工作十年,没有用心去学习过也不过是...

    这是一篇走心的填坑笔记,自学Java的几年总是在不断学习新的技术,一路走来发现自己踩坑无数,而填上的坑却屈指可数。突然发现,有时候真的不是几年工作经验的问题,有些东西即使工作十年,没有用心去学习过也不过是一个10年大坑罢了(真实感受)。

    刚开始接触多线程时,就知道有等待/唤醒这个东西,写过一个demo就再也没有看过了,至于它到底是个什么东西,或者说它能解决什么样的问题,估计大多数人和我一样都是模棱两可。这次笔者就尝试带你搞懂等待/唤醒机制,读完本文你将get到以下几点:

    1. 循环等待带来什么样的问题
    2. 用等待唤醒机制优化循环等待
    3. 等待唤醒机制中的被忽略的细节

    一. 循环等待问题

    假设今天要发工资,强老板要去吃一顿好的,整个就餐流程可以分为以下几个步骤:

    1. 点餐
    2. 窗口等待出餐
    3. 就餐
      public static void main(String[] args) {     // 是否还有包子        AtomicBoolean hasBun = new AtomicBoolean();                // 包子铺老板        new Thread(() -> {            try {                // 一直循环查看是否还有包子                while (true) {                    if (hasBun.get()) {                        System.out.println("老板:检查一下是否还剩下包子...");                        Thread.sleep(3000);                    } else {                        System.out.println("老板:没有包子了, 马上开始制作...");                        Thread.sleep(1000);                        System.out.println("老板:包子出锅咯....");                        hasBun.set(true);                    }                }            } catch (InterruptedException e) {                e.printStackTrace();            }        }).start();        new Thread(() -> {            System.out.println("小强:我要买包子...");            try {                // 每隔一段时间询问是否完成                while (!hasBun.get()) {                    System.out.println("小强:包子咋还没做好呢~");                    Thread.sleep(3000);                }                System.out.println("小强:终于吃上包子了....");            } catch (InterruptedException e) {                e.printStackTrace();            }        }).start();    }
    3b5d4635a8ceffbab25ca832a84b7694.png

    在上文代码中存在一个很大的问题,就是老板需要不断的去检查是否还有包子,而客户则需要隔一段时间去看催一下老板,这显然是不合理的,这就是典型的循环等待问题。

    6436686341383d383ca760cb28644605.png

    这种问题的代码中通常是如下这种模式:

       while (条件不满足) {       Thread.sleep(3000);   }   doSomething();

    对应到计算机中,则暴露了一个问题:不断通过轮询机制来检测条件是否成立, 如果轮询时间过小则会浪费CPU资源,如果间隔过大,又导致不能及时获取想要的资源。

    二,等待/唤醒机制

    为了解决循环等待消耗CPU以及信息及时性问题,Java中提供了等待唤醒机制。通俗来讲就是由主动变为被动, 当条件成立时,主动通知对应的线程,而不是让线程本身来询问。

    2.1 基本概念

    等待/唤醒机制,又叫等待通知(笔者更喜欢叫唤醒而非通知),是指线程A调用了对象O的wait()方法进入了等待状态,而另一个线程调用了O的notify()或者notifyAll()方法,线程A收到通知后从对象O的wait()方法返回,进而执行后续操作。

    上诉过程是通过对象O,使得线程A和线程B之间进行通信, 在线程中调用了对象O的wait()方法后线程久进入了阻塞状态,而在其他线程中对象O调用notify()或notifyAll方法时,则会唤醒对应的阻塞线程。

    2.2 基本API

    等待/唤醒机制的相关方法是任意Java对象具备的,因为这些方法被定义在所有Java对象的超类Object中。

    notify: 通知一个在对象上等待的线程,使其从wait()方法返回,而返回的前提是该线程获取到对象的锁

    notifyAll: 通知所有等待在该对象上的线程

    wait: 调用此方法的线程进入阻塞等待状态,只有等待另外线程的通知或者被中断才会返回,调用wait方法会释放对象的锁

    wait(long) : 等待超过一段时间没有被唤醒就超时自动返回,单位是毫秒。

    2.3 用等待唤醒机制优化循环等待

    public static void main(String[] args) {   // 是否还有包子        AtomicBoolean hasBun = new AtomicBoolean();        // 锁对象        Object lockObject = new Object();        // 包子铺老板        new Thread(() -> {            try {                while (true) {                    synchronized (lockObject) {                        if (hasBun.get()) {                            System.out.println("老板:包子够卖了,打一把王者荣耀");                            lockObject.wait();                         } else {                            System.out.println("老板:没有包子了, 马上开始制作...");                            Thread.sleep(3000);                            System.out.println("老板:包子出锅咯....");                            hasBun.set(true);                            // 通知等待的食客                            lockObject.notifyAll();                        }                    }                }            } catch (InterruptedException e) {                e.printStackTrace();            }        }).start();        new Thread(() -> {            System.out.println("小强:我要买包子...");            try {                synchronized (lockObject) {                    if (!hasBun.get()) {                        System.out.println("小强:看一下有没有做好, 看公众号cruder有没有新文章");                        lockObject.wait();                     } else {                        System.out.println("小强:包子终于做好了,我要吃光它们....");                        hasBun.set(false);                        lockObject.notifyAll();                        System.out.println("小强:一口气把店里包子吃光了, 快快乐乐去板砖了~~");                    }                }            } catch (InterruptedException e) {                e.printStackTrace();            }        }).start(); }
    c12961ebe54f97b023032630fc433099.png

    上述流程,减少了轮询检查的操作,并且线程调用wait()方法后,会释放锁,不会消耗CPU资源,进而提高了程序的性能。

    三. 等待唤醒机制的基本范式

    等待、唤醒是线程间通信的手段之一,用来协调多个线程操作同一个数据源。实际应用中通常用来优化循环等待的问题,针对等待方和通知方,可以提炼出如下的经典范式。

    需要注意的是,在等待方执行的逻辑中,一定要用while循环来判断等待条件,因为执行notify/notifyAll方法时只是让等待线程从wait方法返回,而非重新进入临界区

    /** * 等待方执行的逻辑 * 1. 获取对象的锁 * 2. 检查条件,如果条件不满足,调用对象的wait方法,被通知后重新检查条件 * 3. 条件满足则执行对应的逻辑 */synchronized(对象){    while(条件不满足){        对象.wait()    }    doSomething();}/** * !! 通知方执行的逻辑 * 1. 获取对象的锁 * 2. 改变条件 * 3. 通知(所有)等待在对象上的线程 */synchronized(对象){    条件改变    对象.notify();}

    这个编程范式通常是针对典型的通知方和等待方,有时双方可能具有双重身份,即使等待方又是通知方,正如我们上文中的案例一样。

    四. notify/notifyAll不释放锁

    相信这个问题有半数工程师都不知道,当执行wait()方法,锁自动被释放;但执行完notify()方法后,锁不会释放,而是要执行notify()方法所在的synchronized代码块后才会释放。这一点很重要,也是很多工程师容易忽略的地方。

    lockObject.notifyAll();System.out.println("小强:一口气把店里包子吃光了, 快快乐乐去板砖了~~");

    案例代码中,故意设置成先notifyAll,然后在打印;上文图中的结果也印证了了我们的描述,感兴趣的小伙伴可以动手执行一下案例代码哦。

    五. 等待、唤醒必须先获取锁

    在等待、唤醒编程范式中的wait,notify,notifyAll方法往往不能直接调用, 需要在获取锁之后的临界区执行

    并且只能唤醒等待在同一把锁上的线程。

    当线程调用wait方法时会被加入到一个等待队列,当执行notify时会唤醒队列中第一个等待线程(等待时间最长的线程),而调用notifyAll时则会唤醒等待线程中所有的等待线程。

    2479d6e5032e1bedde4ae77e4eee7080.png

    六. sleep不释放锁 而wait 释放

    在用等待唤醒机制优化循环等待的过程中,有一个重要的特征就是原本的sleep()方法用wait()方法取代,他们的最大的区别在于wait方法会释放锁,而sleep不会,除此之外,还有个重要的区别,sleep是Thread的方法,可以在任意地方执行;而wait是Object对象的方法,必须在synchronized代码块中执行

    展开全文
  • 我有一个需要等待一段时间的应用程序.它必须等到服务器填充几个数据字段.服务器的API为我提供了一种请求数据的方法,很简单……服务器的API还提供了一种接收我的数据的方法,一次一个字段.它并没有告诉我何时完成所有...

    我有一个需要等待一段时间的应用程序.它必须等到服务器填充几个数据字段.

    服务器的API为我提供了一种请求数据的方法,很简单……

    服务器的API还提供了一种接收我的数据的方法,一次一个字段.它并没有告诉我何时完成所有字段的填充.

    在我的请求完成服务器处理之前,最有效的方法是什么?这是一些伪代码:

    public class ServerRequestMethods {

    public void requestData();

    }

    public interface ServerDeliveryMethods {

    public void receiveData(String field, int value);

    }

    public class MyApp extends ServerRequestMethods implements ServerDeliveryMethods {

    //store data fields and their respective values

    public Hashtable myData;

    //implement required ServerDeliveryMethods

    public void receiveData(String field, int value) {

    myData.put(field, value);

    }

    public static void main(String[] args) {

    this.requestData();

    // Now I have to wait for all of the fields to be populated,

    // so that I can decide what to do next.

    decideWhatToDoNext();

    doIt();

    }

    }

    我必须等到服务器完成填充我的数据字段,服务器不会让我知道请求何时完成.所以我必须继续检查我的请求是否已经完成处理.最有效的方法是什么?

    wait()和notify(),一个守护while循环的方法,每当我被notify()唤醒时,检查我是否已经拥有了所有必需的值?

    Observer和Observable,有一个方法可以在每次调用Observer.Update()时检查是否具有所有必需的值?

    什么是最好的方法?谢谢.

    展开全文
  • JAVA中想让代码等待一段时间再继续执行,可以通过让当前线程睡眠一段时间的方式。 方法一:通过线程的sleep方法。 Thread.currentThread().sleep(1000); 在需要程序等待的地方加入这个语句,实现让程序等待,...
  • JAVA中想让代码等待一段时间再继续执行,可以通过让当前线程睡眠一段时间的方式。  方法一:通过线程的sleep方法。 1 Thread.currentThread().sleep(1000);在需要程序等待的地方加入这个语句,实现让程序等待,...
  • 在需要程序等待的地方加入这个语句,实现让程序等待,这里的参数1000是以毫秒为单位,即这语句可以让程序等待1秒。 方法二:TimeUnit类里的sleep方法。 1 TimeUnit.DAYS.sleep(1);//天 2 TimeUnit.HOURS.sleep(1);//...
  • 在最近的面试中有许多人被问到多线程和高并发的问题,但是又对这块不是很了解,很简单就被面试官给问倒了,被问倒的后果当然就是被刷下去了,所以小编整理了这Java多线程和并发的面试题,希望大家看完可以有所...
  • JAVA中可以通过让当前线程睡眠一段时间的方式。 方法一:通过线程的sleep方法。 Thread.currentThread().sleep(1000); 参数1000是以毫秒为单位,即这语句可以让程序等待1秒。 方法二:TimeUnit类里的sleep方法。 ...
  • Java 调用一个三方申请接口需要等一段时间,时间不确定再调用申请结果查询接口,...这种接口服务应该设计为异步Java调用一个三方应用程序接口需要等待一段时间,时间不确定,然后调用应用程序结果查询接口,如果s...
  • Java等待时间

    2020-08-11 23:29:37
    JAVA中想让代码等待一段时间再继续执行,可以通过让当前线程睡眠一段时间的方式。 方法一:通过线程的sleep方法。 Thread.currentThread().sleep(1000); 在需要程序等待的地方加入这个语句,实现让程序等待,这里的...
  • 我想知道的是如何等待它准确,比如在谷歌地图中,​​当你收到“等待位置”的祝酒消息时.如果您看到任何方式可以改进代码,它也会有所帮助.代码:public class Clue extends Activity {public s...
  • 按照道理来说,应该是前端兄弟限定就好,但是产品有需求,那么就得干,在产品眼里,后端就是万能的,然后搜索到个文章,虽然方向不同,但是冲了句话,就是贴进来了,希望努力不会白费,不该被辜负(java)预约日期+时间_...
  • 不知道题中的一段文字出自何处。“锁池”和“等待池”这种翻译我还是头一回见。不过,题主的思路已经对了,即不拘泥于文字,而是在考虑这两个东西在锁的调度(即决定哪个线程可以获得锁的过程)中起到什么作用。Java...
  • 前言如果有天,你的Java程序长时间停顿,也许是它病了,需要用jstack拍个片子分析分析,才能诊断具体什么病症,是死锁综合征,还是死循环等其他病症,本文我们起来学习jstack命令~jstack 的功能jstack用法线程...
  • 各位大侠好,最近在做的个工具时HttpURLConnection访问...用 sleep 和 Timer 都不行,就好像直接跳过这两句了,其实要实现的功能就是:java 连接个视频网站,然后模拟在看视频。请问各位大侠这个应该要怎么实现?
  • java一段逻辑编写

    2013-01-30 10:35:54
    有一段逻辑: 在一段时间之内(比如5分钟),如果在一个map中有值,就跳出等待,如果没有值,就等待5分钟,返回空。 如何写这个逻辑,要求高效,谢绝for循环时间然后sleep,谢谢!

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,114
精华内容 445
关键字:

java等待一段时间

java 订阅