扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
你说的应该不是sleep吧。呵呵,
江达网站制作公司哪家好,找成都创新互联公司!从网页设计、网站建设、微信开发、APP开发、响应式网站开发等网站项目制作,到程序开发,运营维护。成都创新互联公司2013年开创至今到现在10年的时间,我们拥有了丰富的建站经验和运维经验,来保证我们的工作的顺利进行。专注于网站建设就选成都创新互联公司。
这么简单的话,就没必要在这里问了。
我猜测呢,你是要在多线程计时任务
Task线程里面有个while循环?
那么你需要一个TimerTask 来控制这个线程,也就是计时线程。
那么这个计时线程,有两种方法~
第一种,比较不讲究的方法,也就是,对结果处理不好的方式,类似于过时方法的stop,就是把你的Task线程在TimerTask里面启动。
TimerTask里面类似于
while(true){
Task.start();
Date date = new Date();
while(true){
计算时间差,如果时间差大于超时时间,则break
}
}
而在Task线程中,需要加上一行代码
this.setDeamon(true);
将这个task任务设置成后台线程。
因为是TimerTask启动的这个后台任务线程, 一旦超时,那么,这个后台线程Task将会被强制shutdown 。
这种方式适用于不怎么严格的线程要求。
还有一种呢,就是比较严格,对后台处理要求很高的那种。
就是两个线程中需要有共享的变量,将结果,运行状态,都要共享,当TimerTask发现超时的时候,会判断Task线程的处理结果。以及运行状态,而做出相应的处理。
你问的问题比较宽泛。所以,我只能大致的把思路给介绍一下。
如果,能牵扯到实际的问题,那样就容易判断用那种方式的线程超时机制比较好了。呵呵
最后,节日愉快~~
何不使用线程?
一些说明我已经写在注释中了
public class Test implements Runnable {
//定义一个线程
Thread thread;
//用于停止线程的标志
private boolean flag=true;
public Test(){
thread=new Thread(this);
}
//因为该类实现了Runnable,就必须有run方法,当线程启动时,会调用这个run方法
public void run(){
//获得当前的时间,毫秒为单位
long beginTime=System.currentTimeMillis();
//定义已过去的时间
long time=0;
while(flag){
//这里写实现计时的代码
//在这里,获得已过去的时间
time=System.currentTimeMillis()-beginTime;
System.out.println("已过"+time+"毫秒");
//暂停线程1秒钟,不暂停的话可以把下面代码去掉
try{
Thread.sleep(1000);
}catch(InterruptedException e1){
e1.printStackTrace();
}
}
}
//这里是启动线程的方法,也就是启动线程
public void start(){
thread.start();
}
//这里是暂停的方法,暂停线程
public void Pause(){
try{
thread.wait();
}catch(InterruptedException e){
e.printStackTrace();
}
}
//这里是继续的方法,唤醒线程
public void Resume(){
thread.notifyAll();
}
//停止线程
public void stop(){
//把flag设成false,则在run中的while循环就会停止循环
flag=false;
}
public static void main(String []args){
//用于测试
Test t=new Test();
//开始线程
t.start();
try{
//10000毫秒以后结束线程
Thread.sleep(10000);
}catch(InterruptedException e1){
e1.printStackTrace();
}
//结束线程
t.stop();
}
}
你要的是这个吧:
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.text.DateFormat;
import java.util.Date;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
public class GUIThread extends JFrame implements java.awt.event.ActionListener{
private JButton jb1 = new JButton("计时");
private JButton jb2 = new JButton("当前时间");
private JLabel jl1 = new JLabel("");
private JLabel jl2 = new JLabel("");
public GUIThread(){
super("GUIThread");
this.setSize(300,200);
this.setLocation(400, 400);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setLayout(new GridLayout(2,2));
this.jb1.addActionListener(this);
this.jb2.addActionListener(this);
this.add(jb1);
this.add(jl1);
this.add(jb2);
this.add(jl2);
this.setVisible(true);
}
public static void main(String[] args){
new GUIThread();
}
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
Object jb = e.getSource();
if(jb == jb1){
new TimingTime(jl1).start();
jb1.setEnabled(false);
}else{
new NowTime(jl2).start();
}
}
}
class NowTime extends Thread{
private JLabel jl;
public NowTime(JLabel jl){
this.jl = jl;
}
@Override
public void run() {
// TODO Auto-generated method stub
while(true){
try {
sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Date d = new Date() ;
this.jl.setText(d.getYear()+"-"+(d.getMonth()+1)+"-"+d.getDate()+" "+d.getHours()+":"+d.getMinutes()+":"+d.getSeconds());
}
}
}
class TimingTime extends Thread{
private JLabel jl;
private long l = new Date().getTime();
public TimingTime(JLabel jl){
this.jl = jl;
}
@Override
public void run() {
// TODO Auto-generated method stub
while(true){
try {
sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
int emp = 1000;
int i = (int) ((new Date().getTime() - l)/emp);
jl.setText(String.valueOf(i));
}
}
}
应该用线程里面的Timer来控制package com.sy.game.test;
import java.util.Timer;
import java.util.TimerTask;
public class TimeTask {
public static void main(String[] args) {
TimeTask tTask=new TimeTask();
tTask.timeVoid();
}
public void timeVoid(){
final Timer timer = new Timer();
TimerTask tt=new TimerTask() {
@Override
public void run() {
System.out.println("到点啦!");
timer.cancel();
}
};
timer.schedule(tt, 3000);
}
}
整合的:
/*
* java倒计时器
* shiyang
* */
package com.sy.game.test;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.Timer;
@SuppressWarnings("unused")
public class TimeController extends JFrame implements ActionListener {
private static final long serialVersionUID = 4603262282860990473L;
private static final int DEFAULT_WIDTH = 200;
private static final int DEFAULT_HEIGHT = 100;
private static final int width = Toolkit.getDefaultToolkit()
.getScreenSize().width;
private static final int height = Toolkit.getDefaultToolkit()
.getScreenSize().height;
private Container container;
private JButton btn;
private JTextField jtfTime;
private Timer tmr;
public TimeController() {
initComponents();
Timer tmr = new Timer(1000, this);
this.tmr = tmr;
setVisible(true);
}
private void initComponents() {
this.setTitle("SY秒表");
this.setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);
this.setResizable(false);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setLocation((width - DEFAULT_WIDTH) / 2,
(height - DEFAULT_HEIGHT) / 2);
jtfTime = new JTextField("10");
btn = new JButton("开始倒计时");
container = getContentPane();
JPanel panel = new JPanel();
panel.add(btn);
panel.add(jtfTime);
this.add(panel);
btn.addActionListener(this);
}
public void actionPerformed(ActionEvent ae) {
if (ae.getSource() == btn) {
jtfTime.setText("10");
tmr.start();
} else {
int t;
t = Integer.parseInt(jtfTime.getText());
t--;
jtfTime.setText("" + t);
if (t = 0) {
tmr.stop();
}
}
}
public static void main(String[] args) {
TimeController timeController = new TimeController();
}
}
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流