(8)线程的同步和定时器

 

11,09,07

今天的课堂主要内容:

首先,今天老师对昨天的作业进行了讲解。

作业题是写一个抢票的程序,本题对我来说还似乎可以理解的,本题在Java课本的P317、P318,在P317的实例是一个不合理的情况。

分析一下部分代码:

//访问数据的线程

Class Tickets Thread extends Thread{

       Tickets t;

       String name;

       Public TicketsThread(Tickets t,String name){

              This.t=t;

              This.name=name;

              start();//启动线程的操作

}

public void run(){

              try{

                     for(int i=0;i<5;i++){//循环5次,抢5次票

                            System.out.println(name+”抢到了第”+t.tickets+”号票”);

                            t.tickets--;//抢票一张后,递减

                            Thread.sleep(20);//睡眠20毫秒

}

}catch(Exception e){}//捕获异常

}

}

//测试多线程访问时的问题

public class TestMulThread{

       public static void main(String[] args){

              Tickets t=new Tickets(); //共享资源也叫临界资源

              TicketsThread d1=new TicketsThread(t,”小王”); //启动第一个线程

              TicketsThread d2=new TicketsThread(t,”小张”); //启动第二个线程

}

}

如果线程处在堵塞状态被中断时,则会抛异常。

2、实例:

TestInterrupt 包含主方法

       构建线程类 class : InterruptThread extends Thread

  重新run();

       System.out.println(Thread.interrupted());  //清除中断标记

3、实例:

类Stack

synchronized push(){           //给临界资源加锁

}

if(   )

this.wait();  //对临界资源调用wait()方法,使当前线程阻塞,让出CPU,同时释放对临界资源加的互斥锁

this.notify(); //调用临界资源notify()方法,唤醒线程

this.notifyAll();  //把等待的线程都唤醒。

注意:wait()方法 和 notify()方法 成对使用。

4、index 用来记录栈顶位置,堆栈区域

   push();   入栈操作

   while(index==data.length)   //这个条件若是成立,则说明桟是满的

   index--;   //栈顶标识数据  -1 。

   this.notify();  //唤醒刚才有数据的线程

   synchronized   锁的标记。

5、定时器:Timer和TimerTask

(1)java.util包中的Timer和TimerTask类也可实现多线程

(2)Timer类实现的是类似闹钟的功能,也就是定时或者每隔一定时间间隔触发一次线程。

(3)TimerTask类是一个抽象类,该类实现了Runnable接口,具备多线程的能力。

(4)通过继承TimerTask类创建子类,使该子类获得多线程的能力,将需要多线程执行的代码书写在run方法内部,然后通过Timer类启动线程的执行。

实例:部分代码解析

public class TestTimer {

       public static void main(String[] args) {

              Timer t = new Timer();//定时器

              TimerTask1 tt1 = new TimerTask1();

              t.schedule(tt1, 0);//启动线程,tt1是需要启动的线程对象 。参数0表示延迟0毫秒启动该线程,即立刻启动线程

try{

                     for(int i = 0;i < 5;i++){

                            Thread.sleep(1000);

                            System.out.println("Main:" + i);

                     }

              }catch(Exception e){}

       }

}

schedule()方法

(1)public void schedule(TimerTask task,Date time):该方法的作用是在到达time指定的时间或已经超过该时间时执行线程task。
Eg:Date d = new Date(2009-1900,10-1,1,10,0,0);
t. schedule(task,d);   //调用schedule()方法

(2)public void schedule(TimerTask task, Date firstTime, long period):在时间到达firstTime开始,每隔period毫秒就启动一次task指定的线程,这种方式会重复启动线程。
Eg:Date d = new Date(2009-1900,10-1,1,10,0,0);
t. schedule(task,d,20000);   //调用schedule()方法

(3)public void schedule(TimerTask task,long delay)在执行schedule方法delay毫秒以后启动线程task。
t.schedule(task,1000);//在执行该行启动代码1000毫秒后启动一次线程task

(4)public void schedule(TimerTask task,long delay,long period):在执行schedule方法delay毫秒以后启动线程task,然后每隔period毫秒重复启动线程task。

 

课堂感受:通过今天的课程,收获很多,老师给介绍了数字时钟和图形的时钟,感觉很神奇。还记得刚进入大一的时候,就是学Java专业的学哥学姐们 给我们展示他们的作品,就有老师今天介绍的时钟 ,还有聊天室 ,当初 对它们都有一种 敬佩之情。感觉现在自己也和 他们当初一样了,很高兴。 希望 自己继续 努力 ,超过我们的 学哥学姐们! 给我们自己加加油吧!!大笑

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值