《Java语言》第3章 1线程-教学课件(非AI生成).pptx
第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