威尼斯www.9778.com-威尼斯正版官方网站

一步一步学多线程-Timer,多线程-timer

日期:2019-12-25编辑作者:编程人生
if(g_cdma.ConnectCom(_T("COM"))){HRESULThr;IConnectionPointContainer*pConnectionPointContainer=NULL;IConnectionPoint*pConnectionPoint=NULL;hr=g_cdma.m_lpDispatch-QueryInterface(IID_IConnectionPointContainer,(void**)pConnectionPointContainer);hr=pConnectionPointContainer-FindConnectionPoint(__uuidof(ICDMAXEvents),pConnectionPoint);DWORDdwCookie;hr=pConnectionPoint-Advise((IUnknown*)(this),dwCookie);g_cdma.GetVersion();g_cdmaConnected=true;}

一步一步学五十多线程-Timer,八线程-timer

  在进行按期职分的时候能够用Timer来完结,今后我对学到的进展二遍总括,先来看三个demo

 1 public class TimerTest {
 2 
 3     public static void main(String[] args) throws ParseException {
 4         Date date=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse("2017-08-17 11:18:00");
 5         new Timer().schedule(new TimerTask() {
 6             @Override
 7             public void run() {
 8                 System.out.println(new Date().getSeconds()+"  执行");
 9             }
10         }, date);
11     }
12 }

  这段代码的情致是,先建三个Timer,Timer早先实施的小运是” 2017-08-17 11:18:00”。

     在三十二线程中一再用到join(卡塔尔的法子,join()是何等呢?

g_cdma为com组件对象,实施种种作用操作,this继承了平地风波回调接口,Advice(卡塔尔国调用时回来值s_ok,不过实行时报错。

Timer重复施行

  上述代码Timer只会施行一遍,假设我们想让准期职务每间距豆蔻年华段时间就实行吗?当时能够用Timer提供的schedule方法的另多个重载 public void schedule(TimerTask task, long delay, long period卡塔尔(قطر‎。意思是Timer在delay的时候开端施行,每隔period时间长短实施壹回。

 1 public class TimerTest {
 2 
 3     public static void main(String[] args) throws ParseException {
 4         Date date=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse("2017-08-17 11:18:00");
 5         new Timer().schedule(new TimerTask() {
 6             @Override
 7             public void run() {
 8                 System.out.println(new Date().getSeconds()+"  执行");
 9             }
10         }, date,1000);
11     }
12 }

     Thread类的Join(卡塔尔措施能够将七个轮换厉行的线程并合为次序厉行的线程。举例在线程B中调用了线程A的Join(卡塔尔措施,线程A将插入线程B以前,直到线程A厉行告终后,才会继续厉行线程B。

实行结果

  37  执行

  38  执行

  39  执行

  40  执行

  ……

    代码如下:

Timer施行延时

  在试行TimerTask的时候恐怕会现身线程实施时间过长的情状,超越了Timer的等待时间。这个时候会是哪些情状呢?

  

 1 public class TimerTest {
 2 
 3     public static void main(String[] args) throws ParseException {
 4         Date date=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse("2017-08-17 11:18:00");
 5         new Timer().schedule(new TimerTask() {
 6             @Override
 7             public void run() {
 8                 System.out.println(new Date().getSeconds()+"  开始执行");
 9                 try {
10                     Thread.sleep(2000);
11                     System.out.println(new Date().getSeconds()+"  执行结束");
12                 } catch (InterruptedException e) {
13                     e.printStackTrace();
14                 }
15             }
16         }, date,1000);
17     }
18 }

   

看实行结果

  0  最早实行

  2  执行完结

  2  上马推行

  4  试行完毕

  4  起头施行

  6  试行达成

  6  此前实践

  8  实施实现

  8  起始实践

package com.cn.process;

public class test {

    /**
     * @param args
     */

   public class hello implements Runnable
    {

        @Override
        public void run() {
            // TODO Auto-generated method stub
             for (int i = 0; i < 3; i++) 
             { 
                                                          System.out.println(Thread.currentThread().getName()+i);            
             }

 }


    }

    public static void main(String[] args) throws InterruptedException {
        String threadName = Thread.currentThread().getName();    
        test test=new test();
        hello he=test.new hello();

        Thread demo = new Thread(he,"线程");//第二个参数是线程名称(自定义)           
        demo.start();//调用start方法但是调用该方法只是准备线程并不是马上启动
        demo.join(); //强制执行demo,只有当demo线程执行结束之后主线程才能继续当前主线程执行--相当于在主线程中添加了demo的子线程, 使异步执行线程转为同步执行
        //demo.start();//join()方法在start()前后显示的结果明显的不一样  可以证明只有当start()启动后 才能正确执行join() 
        for(int i=0;i<50;++i)
        {     
                    System.out.println(threadName +"线程执行-->"+i);           
                 }         
}

}  

scheduleAtFixedRate

  使用schedule方法推行Timer职务,要是从前的时日是在当下时刻在此以前,Timer并不会对此前从没进行的职务举办补给实施。也便是延时之后,那么Timer就从脚下时光开首接着根据间隔时间实践。但是不常大家的急需尤为敬服的实施的频率,须要把因为延时而诱致未有奉行的天职补充回来,那时就须求用到scheduleAtFiexdRate。

 1 public class TimerTest {
 2 
 3     public static void main(String[] args) throws ParseException {
 4         final Date date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse("2017-08-17 11:52:00");
 5         new Timer().scheduleAtFixedRate(new TimerTask() {
 6             @Override
 7             public void run() {
 8                 System.out.println(date);
 9                 System.out.println(new Date().getSeconds() + "  开始执行");
10                 System.out.println("执行了");
11                 System.out.println(new Date().getSeconds() + "  执行结束");
12 
13             }
14         }, date, 10000);
15     }
16 }

  实行的结果是:

实行理并了结果 

  39  发轫推行

  执行了

  39  奉行完成

  Thu Aug 17 11:52:00 CST 2017

  39  开始施行

  执行了

  39  施行实现

  Thu Aug 17 11:52:00 CST 2017

  40  开始执行

  执行了

  40  实行实现

 

  通过推行结果能够看出来,scheduleAtFixedRate上来就先将缺点和失误的施行补上,然后再起来遵从间距时间贰遍三遍试行。

线程0
线程1
线程2
main线程施行-->0
main线程施行-->1
main线程奉行-->2
main线程推行-->3
main线程试行-->4
main线程实践-->5
main线程实行-->6
main线程试行-->7
main线程试行-->8
main线程实践-->9
main线程施行-->10
main线程实践-->11
main线程实施-->12
main线程推行-->13
main线程实施-->14
main线程实行-->15
main线程施行-->16
main线程奉行-->17
main线程试行-->18
main线程奉行-->19
main线程施行-->20
main线程奉行-->21
main线程奉行-->22
main线程实践-->23
main线程实践-->24
main线程实践-->25
main线程施行-->26
main线程施行-->27
main线程试行-->28
main线程施行-->29
main线程实践-->30
main线程施行-->31
main线程奉行-->32
main线程施行-->33
main线程推行-->34
main线程试行-->35
main线程试行-->36
main线程履行-->37
main线程执行-->38
main线程实践-->39
main线程推行-->40
main线程实施-->41
main线程实践-->42
main线程推行-->43
main线程推行-->44
main线程实行-->45
main线程实施-->46
main线程试行-->47
main线程施行-->48
main线程实施-->49

将Timer设置成守护线程

 1 public class TimerTest {
 2 
 3     public static void main(String[] args) throws ParseException {
 4         final Date date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse("2017-08-17 11:52:00");
 5         Timer timer=new Timer();
 6         TimerTask timerTask= new TimerTask() {
 7             @Override
 8             public void run() {
 9                 System.out.println(date);
10                 System.out.println(new Date().getSeconds() + "  开始执行");
11                 System.out.println("执行了");
12                 System.out.println(new Date().getSeconds() + "  执行结束");
13 
14             }
15         };
16         timer.schedule(timerTask, date);
17     }
18 }

 

  在施行完代码之后,程序照旧在运作。看Timer.class的源代码能够发掘Timer是创制了一个新的线程,而不仅仅追踪代码开掘,新的线程实行了贰个while(true卡塔尔(英语:State of Qatar)循环,再当中步向了等待状态。

1 public Timer(String name) {
2     thread.setName(name);
3     thread.start();
4 }

ok  成功  起到了join的作用!

消除办法

  将提姆er设置成守护线程,Timer有个布局函数。

1 public Timer(boolean isDaemon) {
2     this("Timer-" + serialNumber(), isDaemon);
3 }

  所以大家在将new Timer(卡塔尔国改为new Timer(true卡塔尔(قطر‎就可以。

当自家注释掉前边的start()的时候,

TimerTask和Timer的cancel方法 

  TimerTask的cancel方法是关闭这些任务,Timer的cancel方法是关门全数Timer。

  Timer的实行实际是开发银行了多少个线程然后,线程中维护了三个种类,然后把TimerTask归入队列中。提姆erTask的cancel方法正是将自家从义务队列中移除。Timer的cancel方法,是将队列中的义务总体清空。

在进行准期义务的时候能够用提姆er来完成,现在作者对学到的进展一次总计,先来看一个demo 1 public c...

以下是代码片段:

//demo.start(卡塔尔(قطر‎;//调用start方法但是调用该措施只是计划线程实际不是马上运转
demo.join(卡塔尔国; //强逼试行demo,唯有当demo线程推行达成之后主线程工夫持续当前主线程实施--也等于在主线程中增多了demo的子线程, 使异步试行线程转为同步执行
 demo.start(卡塔尔国;//join(卡塔尔方法在start(卡塔尔前后展现的结果决定的不均等  能够印证唯有当start(卡塔尔国运维后 能力进行join() 也便是说 当join()在前头的话就错失了意义

实施结果大概是(cpu有关):

线程0
main线程推行-->0
main线程实践-->1
main线程试行-->2
main线程实践-->3
main线程实践-->4
main线程实行-->5
main线程实行-->6
main线程施行-->7
main线程试行-->8
main线程推行-->9
线程1
线程2
main线程推行-->10
main线程施行-->11
main线程奉行-->12
main线程实行-->13
main线程实践-->14
main线程推行-->15
main线程实践-->16
main线程试行-->17
main线程试行-->18
main线程施行-->19
main线程实践-->20
main线程实行-->21
main线程推行-->22
main线程履行-->23
main线程试行-->24
main线程实行-->25
main线程实行-->26
main线程推行-->27
main线程实施-->28
main线程实行-->29
main线程推行-->30
main线程试行-->31
main线程推行-->32
main线程推行-->33
main线程实行-->34
main线程实施-->35
main线程试行-->36
main线程实践-->37
main线程奉行-->38
main线程推行-->39
main线程施行-->40
main线程试行-->41
main线程推行-->42
main线程实践-->43
main线程试行-->44
main线程施行-->45
main线程试行-->46
main线程推行-->47
main线程施行-->48
main线程实践-->49

那就能够看看了 join()前后相继顺序是或不是起效果了!

 

本文由威尼斯www.9778.com发布于编程人生,转载请注明出处:一步一步学多线程-Timer,多线程-timer

关键词:

matlab与vs混合编程问题

为什么点了之后只有哪里错了? 用matlab生成的mydecimate.h中有externLIB_myDecimate_C_APIboolMW_CALL_CONVmyDecimateInitialize(void)在主...

详细>>

32 Top命令

环境说明:1.该进程被PCI设备的中断程序调用,运行在内核态,大概2ms调度一次。2.该进程中创建了两个共享内存(SE...

详细>>

取消高速公路省界收费站重点工作进展情况通报

新人小白一枚,刚完成一个程序,想打包,上网查询后知道installShield可以打包。用自己的笔记本联网验证很快。但是...

详细>>