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专业的学哥学姐们 给我们展示他们的作品,就有老师今天介绍的时钟 ,还有聊天室 ,当初 对它们都有一种 敬佩之情。感觉现在自己也和 他们当初一样了,很高兴。 希望 自己继续 努力 ,超过我们的 学哥学姐们! 给我们自己加加油吧!!