JAVA做一个涉及倒计时功能的问题

我做个网上拍卖的系统,需要个倒计时的功能,比如倒计时300秒(如数据库里商品的 time=300),有人出价就开始倒计时,有人加价就重置到300秒再倒。我现在的做法是一个拍品有人竞价,就单独开始一个线程,在线程里隔一秒减一下数据库里设置的time。
但这样做,在拍品少的时候没问题,当有几百上千件拍品,且全部有人出价时,就搞不定了。不说线程的数量,就每秒更新数据库的时间都超过了1秒,再加上线程里设置的1秒延时,页面上会2秒才动一下了。
想请教下大家,有没有别的方法,性能更好的?
大家都提到放到内存里更新,这样肯定是最好的。但我这有一些要求的,放内存的话一断服务器出问题,我这剩下的秒数就没有了,而我是需要这数据以最快的时间接着开的。
谢谢大家的帮助,这让我咋选最佳答案啊。。。。。

在线程里隔一秒减一下数据库里设置的time。这么犀利的招数你都能想的出来啊!你的服务器还真是强大,不死机都谢天谢地啊!
具体的代码我懒的写,给你个思路吧,写线程但是别往数据库存,线程有睡眠功能.sleep(),有人点了竞拍,线程启动,立马睡眠300秒,睡醒就表示竞拍时间结束了,可以往数据库存了,要是又有人竞拍这个物品,前面睡眠的线程直接stop,再开一个线程继续睡觉300秒追问

这样做的话,前端页面上的倒计时秒数要如何显示呢?

追答

这个是每个登陆的人都要看到吗?还是只是当前竞拍的人能看到,要是只是当前竞拍的人看,可以直接在页面上做一个倒计时,不需要关联程序
如果是每个人都要看到,你可以把在线程启动的时候把时间记下来,放在缓存中最好要是怕同时竞拍的物品太多可以存到数据库去,然后别人登录的时候拿出这个时间,计算时间差,用这个时间差来在页面上做倒计时,也是不关联程序的

追问

所有参加这场拍卖会的人都能看到,而且是同步的。。。。

追答

那就做时间差,我说的第二个方法,只要你的服务器不是延时几十秒的都没问题的,一般强大的服务器不会有太多延时,几十毫秒还是有的,不过根本察觉不出来,只在页面上写个倒计秒的小程序应该不难吧?
忘了说了,别用stop方法,用interrupt终止睡眠线程,比如线程A和线程B,线程A处于运行态,线程B处于非运行态,这时线程A想终止线程B,就用interrupt方法。

温馨提示:内容为网友见解,仅供参考
第1个回答  2013-08-20
不要实时的更新数据库。
把time计时放在内存里做。
比如,一个拍品有一个  synchronized time, 竞价的时候更新这个值。但竞价结束以后,再更新数据库。

追问

我最初也是这么想的,但就怕一旦服务器出现问题,我这TIME就没处可找了。
我们这拍卖有点特殊,出问题了也得接着前面的继续拍。

追答

那可以考虑外部的分部式缓存,比如Redis,能持久化在硬盘上。

本回答被提问者采纳
第2个回答  2013-08-20

页面上这么做

var intervalId = setInterval(function(){
                    if (time > 0)
                    {
                        time --;
                        //用js更新你的页面时间
                    }
                    else
                    {
                        //时间到了你要做的
                        clearInterval(intervalId);
                    }
                },1000);
                
后台要使用内存,别尼玛那样搞数据库。老板骂死你的。

当有其他人访问要通知页面重新计时以及改变价格,这要用到“推”的技术,或者土鳖办法一直请求查看价格。

追问

我也不想那么搞数据库啊。。。但我这个还有个要求的,出现意外情况也得接着前面的信息继续拍的。放在内存是好,我就怕服务器要是万一出个啥问题,我没法保存剩下的秒数。。。

追答

我次奥。。。服务器都出个啥子问题了你还存个秒数干蛋用

追问

。。。。。存个秒数,其他的信息也存在数据库的,找个备用的服务器好有数据重开。
政府委托的扯淡业务,再有一群扯淡的竞买人,开不下去和能接着开对公司的结果很不一样.....

追答

那已分钟来更新吧,但这样搞程序的复杂性几何性增长。

第3个回答  2013-08-20
放到session或者application里面不可以吗?

JAVA做一个涉及倒计时功能的问题
具体的代码我懒的写,给你个思路吧,写线程但是别往数据库存,线程有睡眠功能.sleep(),有人点了竞拍,线程启动,立马睡眠300秒,睡醒就表示竞拍时间结束了,可以往数据库存了,要是又有人竞拍这个物品,前面睡眠的线程直接stop,再开一个线程继续睡觉300秒 ...

Java怎么写倒计时 12秒的倒计时 到7的时候输出一句话 到1的时候停下然...
var c=5\/\/设置你要倒计时间 var t\/\/声明倒计时 function timedCount(){ document.getElementById('txt').value=c\/\/在一个输入框中显示时间C c=c-1\/\/重新赋值c if(c<0){learTimeout(t)\/\/如果c小于0时,则退出 t=setTimeout("timedCount()",1000)\/\/设置每秒运行一次函数 } function s...

Java怎么写一个倒计时程序 从10秒开始 到7秒的时候输出一句话 然后继 ...
public class Timer implements Runnable {int i=10;public static void main(String[] args) {Timer t=new Timer();Thread th=new Thread(t);th.start();}@Overridepublic void run() {try {while(true){i--;Thread.sleep(1000);System.out.println(i);if(i==7){System.out.println("...

java 中 倒计时 一分钟 怎么写?
\/\/ TODO Auto-generated method stub countDown(60);\/\/ 倒计时1分钟 } }

怎样用JAVA写一个10钟倒计时程序?
import java.applet.*;public class Clock extends Applet implements Runnable { Thread timer=null;Label label;int lastxs=50,lastys=30,lastxm=50,lastym=30,lastxh=50,lastyh=30;public void init(){ label=new Label(" ");setBackground(Color.white);add(label);} public void paint(...

java写个<<倒计时小程序>>谢谢~谢谢~谢谢~谢谢~谢谢~谢谢~谢谢~谢谢~谢...
import java.io.IOException;public class run_QQ { \/ param args throws InterruptedException throws IOException \/ public static void main(String[] args) throws InterruptedException, IOException { \/\/ TODO Auto-generated method stub for(int i=5;i>0;i--){ System.out.println("将在"+ i...

java 毫秒倒计时器 想编写一个方法,其中就有一个参数 倒计时多长...
main(String [] args){ JFrame jf = new JFrame();jf.setResizable(false);jf.setBounds(0, 0, 460, 330);jf.setLocationRelativeTo(null);jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);jf.add(new NanoTimeframe());jf.setVisible(true);} } 请给分 改得辛苦上面输入毫秒后计时 ...

求一个倒计时,秒表。需要JAVA. 需要有断电记忆功能
在程序中,倒计时可以通过设置'countDownSecondscountDownSeconds变量来设置,秒表可以通过点击"开始"和"停止"按钮来控制计时。每次停止计时后,程序将自动保存当前计时的时间戳,以实现断电记忆功能。import java.awt.*;import java.awt.event.*;import java.io.*;import javax.swing.*;public class Timer...

请问用java怎样用窗口做一个90秒倒计时?
import java.awt.event.*;import java.awt.*;public class Test extends JFrame { private JButton btn = new JButton("Start");private JLabel label = new JLabel();private int time = 90;Test() { setSize(500,300);setLayout(new FlowLayout());add(btn);add(label);btn.addAction...

java做一个倒计时,怎么实现0到9显示2位数,即是00,01,02这样的格式 数字...
定义:java.text.DecimalFormat df = new java.text.DecimalFormat();df.applyPattern("00");使用 df.format(要格式化的数字);

相似回答
大家正在搜