9-7课堂笔记

 

课堂笔记

线程的同步

为什么需要“线程同步”

线程间共享代码和数据可以节省系统开销,提高程序运行效率,但同时也导致了数据的“访问冲突”问题,如何实现线程间的有机交互、并确保共享资源在某些关键时段只能被一个线程访问,即所谓的“线程同步”(Synchronization)就变得至关重要。

临界资源
多个线程间共享的数据称为临界资源
(Critical Resource),由于是线程调度器负责线程的调度,程序员无法精确控制多线程的交替顺序。因此,多线程对临界资源的访问有时会导致数据的不一致行。

使用临界资源。

public class Stack {

       private char[] data=new char[10];

       private int index=0;

       public void push(char ch){

              data[index]=ch;

              System.out.println("压入字符"+ch+"-->");//p1

              index++;

              System.out.println("-->压入"+ch+"操作完成!");

       }

       public char pop(){

              index--;

              return data[index];

       }

}

实例,生产者和消费者。

分析:

生产者-消费者问题是多线程同步处理的典型问题

有一块生产者和消费者共享的有界缓冲区,生产者往缓冲区放入产品,消费者从缓冲区取走产品,这个过程可以无休止的执行,不能因缓冲区满生产者放不进产品而终止,也不能因缓冲区空消费者无产品可取而终止。

数据A读取←公共缓冲区←数据B存入

线程B写一次,线程A读一次

某个时候线程B运行速度比较快,在线程A未读取上一个数据之前,B就写了第二次数据,造成数据遗漏。

在某个时候线程A运行速度比较快,它读完一次数据之后,线程B还没来得及写,线程A又来读第二次。结果线程A读不到数据,导致运行出错。

线程B正在写数据时,线程A也来读取数据,这时可能线程B还没将数据写完,线程A将数据读走,导致程序出错。

解决生产者消费者问题的方法

一种是采用某种机制保持生产者和消费者之间的同步

一种是在生产者和消费者之间建立一个管道

但加了互斥锁以后有可能会造出死锁。这时需要wait()方法和notify()方法--当前线程被阻塞并释放该对象的互斥锁。

定时器:Timer和TimerTask

使用Timer和TimerTask组合实现的多线程。

class TimerTask1 extends TimerTask {      

       public void run() {

              try{

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

                            Thread.sleep(1000);

                            System.out.println("Run" + i);

                     }

              }catch(Exception e){}

       }

}

schedule()方法

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

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

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

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

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值