文档详情

《Java语言》第3章 1线程-教学课件(非AI生成).pptx

发布:2025-04-30约2.24千字共36页下载文档
文本预览下载声明

第3章线程和网络编程;1线程简介;2线程的概念模型;2线程的概念模型;2线程的概念模型;2线程的概念模型;2线程的概念模型;运行结果:;线程的状态;线程的4种状态:创建、可运行、不可运行及死亡状态。;线程调度及线程的优先级;5线程的优先级;5线程的优先级;执行结果:;守护线程;6守护线程;6守护线程;6守护线程;6守护线程;主线程;7主线程;6.2线程同步;我们把一次只允许一个线程使用的共享资源称为临界资源,而在每个进程中访问临界资源的程序段称为临界区。

临界区是一个对象,它是互斥体。当一个线程进入互斥体,互斥体就锁定,此时任何试图进入互斥体的线程都必须等待这个线程出来。

在Java表示临界区或实现线程同步是通过关键字synchronized:如使用同步方法

synchronizedvoidmethodA(){}

同步的例子:模拟打电话的过程。PhoneCall类中的call就是临界区,一旦有线程进入其它线程只有等该线程出来才能进去。在Call线程类中,生成三个线程同时调用call()临界区程序。;PhoneCall类中的call就是临界区,因此用synchronized标志。一旦有线程进入该临界区,其它线程只有等该线程出来才能进去。;publicclassCallextendsThread{

publicCall(Stringarg0){

super(arg0);

}

publicvoidrun(){

PhoneCall.call(getName());

}

publicstaticvoidmain(String[]args){

Callfirst=newCall(First);

Callsecond=newCall(Second);

Callthird=newCall(Third);

first.start();

second.start();

third.start();

}

};在call()方法前加synchronized的运行结果:;在call()方法前没加synchronized的运行结果:;Java程序中多个线程是通过消息实现线程间的通信.

利用wait(),notify()和notifyAll()方法发送消息实现进程间的相互联系.

wait()方法,线程主动调用wait()方法释放临界区等待某个条件满足,等待其他线程用notify()唤醒。

notify()唤醒相同对象中第一个调用wait()的线程。

notifyAll()唤醒所有调用wait()的线程。具有最高优先级的线程最先运行;生产者-消费者的问题;Producer类:该类是个线程类。生产者将10本书存储在BookCase的对象中,表示将书放入书架。

;Consumer类:消费者线程则不断从BookCase对象中取这些书。;在这个例子中,生产者与消费者通过BookCase对象来共享数???。put()和get()方法是临界区。在生产者放入书的同时消费者不能取书。反之也是。因此put()和get()方法必须用synchronized关键字标志起来。生产者调用BookCase的put()方法时,它就锁住BookCase。以阻止消费者访问BookCase中的get()方法。获得对象锁的线程可以通过调用Wait()方法主动释放锁,到等待队列去等待条件满足。这时其它线程可以得到锁从而访问该对象。之后可以通过调用notify()唤醒先前因调用wait()而等待的线程;classBookCase{

privateStringBook;

privatebooleanavailable=false;

publicsynchronizedStringget(){

while(available==false){//表示书架上没有书

try{

wait();//主动让出cpu

}catch(InterruptedExceptione){}

}

system.out.println(“Consumergot:”+Book);//取书

available=false;//修改状态,表示书已取走。

notifyAll();//通知生产者书架已空,可以放书了。

returnBook;

}

;publicsynchronizedvoidput(StringnewBook){

while(available==true){//表示书没有取走

try{

wa

显示全部
相似文档