《第13章龟兔赛跑——多线程》由会员分享,可在线阅读,更多相关《第13章龟兔赛跑——多线程(25页珍藏版)》请在金锄头文库上搜索。
1、第第13章章 龟兔赛跑龟兔赛跑多线程多线程 能力目标:能力目标:n理解多线程、掌握线程的创建、启动、运行等方法。理解多线程、掌握线程的创建、启动、运行等方法。n掌握线程优先级及其设置方法。掌握线程优先级及其设置方法。n理解线程状态,线程中断和线程同步等概念。理解线程状态,线程中断和线程同步等概念。n能使用多线程编写龟兔赛跑程序和生产者消费者程序。能使用多线程编写龟兔赛跑程序和生产者消费者程序。/内容介绍内容介绍n13.1 任务预览任务预览n13.2 程序、进程与线程程序、进程与线程n13.3 多线程多线程n13.4 线程类线程类Threadn13.5 线程同步与互斥线程同步与互斥n13.6 本
2、章小结本章小结n13.7 实训实训13:龟兔赛跑、生产者与消费者:龟兔赛跑、生产者与消费者/13.1 任务预览任务预览 n本章实训程序运行结果:本章实训程序运行结果: /13.2 程序、进程与线程程序、进程与线程 n程序,是代码,是静态的。程序,是代码,是静态的。n进程,是程序在计算机上的一次运行过程,进程是动态的。进程,是程序在计算机上的一次运行过程,进程是动态的。n线程也是动态的,是比进程更小的概念,它是进程(程序运线程也是动态的,是比进程更小的概念,它是进程(程序运行过程)的一条执行路线。行过程)的一条执行路线。nJava语言拥有多线程机制。语言拥有多线程机制。njava.lang包提供
3、线程类包提供线程类Thread,只要定义继承,只要定义继承Thread类类的子类,并重写线程运行方法的子类,并重写线程运行方法run。n线程类的每一个对象都是一个线程,通过线程类的每一个对象都是一个线程,通过start方法启动。方法启动。/【例例例例13-113-1】编写龟兔赛跑多线程程序,设赛跑长编写龟兔赛跑多线程程序,设赛跑长编写龟兔赛跑多线程程序,设赛跑长编写龟兔赛跑多线程程序,设赛跑长度为度为度为度为100100米,每跑完米,每跑完米,每跑完米,每跑完1010米输出一次结果。米输出一次结果。米输出一次结果。米输出一次结果。 class Animal extends Thread /线程
4、类线程类public Animal(String name) /构造方法,参数是线程名构造方法,参数是线程名 super(name);public void run() /线程运行方法线程运行方法 for(int i=0; i=100; i+=10) if (this.getName().equals(乌龟乌龟)System.out.println(tt乌龟跑了乌龟跑了+ i + 米米); else System.out.println(this.getName() + 跑了跑了+ i + 米米); tryThread.sleep(long)(Math.random()*1000); /休眠不
5、超过休眠不超过1秒秒 catch(InterruptedException e) /续例续例13-1public class Example1 /运行主类运行主类public static void main(String args) Animal rabbit = new Animal(兔子兔子); /线程线程(对象对象)1Animal tortoise = new Animal(乌龟乌龟); /线程线程(对象对象)2rabbit.start(); /启动线程启动线程1tortoise.start(); /启动线程启动线程2 / 13.3 多线程多线程13.3.1 构建构建Thread子类对
6、象子类对象 n(1)编写)编写Thread子类,即线程类,格式:子类,即线程类,格式:class 线程类名称线程类名称 extends Thread .public void run() . /线程运行方法线程运行方法n如:如: class Animal extends Thread . n(2)构建线程对象。如:)构建线程对象。如:Animal rabbit = new Animal(兔子兔子); /线程线程(对象对象)1Animal tortoise = new Animal(乌龟乌龟); /线程线程(对象对象)2n(3)调用线程对象的)调用线程对象的start方法启动线程。如:方法启动线
7、程。如:rabbit.start(); /启动线程启动线程1tortoise.start(); /启动线程启动线程2n注:主类注:主类main方法也是一条独立的执行路线(线程)。方法也是一条独立的执行路线(线程)。 /13.3.2 用实现用实现Runnable接口的对象接口的对象构建构建Thread对象对象 n(1)编写实现)编写实现Runnable接口的类,格式:接口的类,格式:class 类名类名 extends 父类父类implements Runnable .public void run() . /线程运行方法线程运行方法n(2)构建实现)构建实现Runnable接口类的对象。如:接
8、口类的对象。如:new Animal2(兔子兔子“)new Animal2(乌龟乌龟)n(3)使用上述对象作参数,构造)使用上述对象作参数,构造Thread对象。如:对象。如:Thread rabbit = new Thread(new Animal2(兔子兔子);Thread tortoise = new Thread(new Animal2(乌龟乌龟n(4)最后调用)最后调用start方法启动线程。方法启动线程。/【例例例例13-213-2】采用实现采用实现采用实现采用实现RunnableRunnable接口的方法编写接口的方法编写接口的方法编写接口的方法编写龟兔赛跑多线程程序,功能与例龟
9、兔赛跑多线程程序,功能与例龟兔赛跑多线程程序,功能与例龟兔赛跑多线程程序,功能与例13-113-1完全一样。完全一样。完全一样。完全一样。 class Animal2 implements Runnable private String name;public Animal2(String name) this.name = name; public String getName() return name; public void run() /线程运行方法线程运行方法 for(int i=0; i=100; i+=10) if (this.getName().equals(乌龟乌龟)Sys
10、tem.out.println(tt乌龟跑了乌龟跑了+ i + 米米); else System.out.println(this.getName() + 跑了跑了+ i + 米米); try Thread.sleep(long)(Math.random()*1000); catch(InterruptedException e) Thread rabbit = new Thread(new Animal2(兔子兔子);Thread tortoise = new Thread(new Animal2(乌龟乌龟);rabbit.start(); tortoise.start(); / 13.4
11、线程类线程类Thread13.4.1 Thread类构造方法及线程名称类构造方法及线程名称 nThread类的类头声明:类的类头声明: public class Thread extends Object implements Runnablen每个线程对象都有名称,如果没有在构造方法中指定,则按每个线程对象都有名称,如果没有在构造方法中指定,则按“Thread-”+ n的形式自动命名,也可用的形式自动命名,也可用setName(String name) 方法设定。方法设定。n常用构造方法:常用构造方法:(1)Thread()。自动起名,用方法。自动起名,用方法getName()获取线程名。获
12、取线程名。(2)Thread(String name):要指定线程名作参数。:要指定线程名作参数。(3)Thread(Runnable target):也是自动起名。:也是自动起名。(4)Thread(Runnable target, String name)。/13.4.2 线程优先级与线程优先级与Thread相关字段相关字段 n线程有线程有10个优先级,从高至低分别是个优先级,从高至低分别是10、9、1。中间。中间级为级为5,它是线程默认的优先级。,它是线程默认的优先级。nThread类有类有3个关于优先级的整型静态常量字段:个关于优先级的整型静态常量字段:(1)MAX_PRIORITY:
13、最大优先级,值是:最大优先级,值是10。(2)MIN_PRIORITY:最小优先级,值是:最小优先级,值是1。(3)NORM_PRIORITY,普通优先级,值是,普通优先级,值是5。n方法方法setPriority(int newPriority)用于设置线程优先级,用于设置线程优先级,n方法方法getPriority()用于获取线程优先级。用于获取线程优先级。/【例例例例13-313-3】改进例改进例改进例改进例13-113-1的龟兔赛跑程序,通过的龟兔赛跑程序,通过的龟兔赛跑程序,通过的龟兔赛跑程序,通过改变优先级,并减掉休眠时间,使得乌龟以迅雷改变优先级,并减掉休眠时间,使得乌龟以迅雷改
14、变优先级,并减掉休眠时间,使得乌龟以迅雷改变优先级,并减掉休眠时间,使得乌龟以迅雷不及掩耳的速度跑完不及掩耳的速度跑完不及掩耳的速度跑完不及掩耳的速度跑完100100米。米。米。米。class Animal3 extends Thread public Animal3(String name) super(name); public void run() for(int i=0; i0) balance += money; notify();println(成功存款¥成功存款¥+ money + ,余额¥,余额¥ + balance); else System.out.println(存款失败
15、存款失败); public synchronized void withdraw(double money) /同步取款同步取款 if (money0) while (moneybalance) try wait(); catch(InterruptedException e) balance -= money; println(成功取款¥成功取款¥+ money + ,余额¥,余额¥ + balance); else System.out.println(取款失败取款失败); public double getBalance() return balance; public String g
16、etName() return name; /续例续例13-5class DepositThread extends Thread Account acc; /存款线程类存款线程类 public DepositThread(Account a) acc = a; public void run() for(int i=0; i5; i+) /存款存款5次次 acc.deposit(int)(Math.random()*1000); /每次每次1000class WithdrawThread extends Thread /取款线程类取款线程类Account acc;public Withdra
17、wThread(Account a) acc = a; public void run() for(int i=0; i= max) /若产品数超出最大库存量若产品数超出最大库存量 try wait(); catch(Exception e) /则等待则等待 this.num +; /直到被通知唤醒才生产直到被通知唤醒才生产 serialNum +; notify(); /通知消费通知消费 (生产编号生产编号+ serialNum + name + ,当前库存数:,当前库存数:+ num); public synchronized void output() /同步的消费同步的消费(出仓出仓)
18、方法方法 while (num = 0) /若库存没有产品若库存没有产品 try wait(); catch(Exception e) /则等待则等待 this.num -; /直到被通知唤醒才消费直到被通知唤醒才消费 notify(); /通知生产通知生产(消费编号消费编号+ name+,当前库存数:,当前库存数:+num); /续续13-6class Producer extends Thread /生产者类生产者类Storage store;public Producer(Storage store) this.store = store; public void run() for(i
19、nt i=0; i10; i+) store.input(); /调用同步生产方法调用同步生产方法 class Consumer extends Thread /消费者类消费者类Storage store;public Consumer(Storage store) this.store = store; public void run() for(int i=0; i10; i+) store.output(); /调用同步消费方法调用同步消费方法 Storage store = new Storage(洗衣机洗衣机, 3); /库存库存3洗衣机仓库洗衣机仓库 Producer produc
20、er = new Producer(store); /生产者生产者Consumer consumer = new Consumer(store); /消费者消费者producer.start();consumer.start();/13.6 本章小结本章小结 n线程是比进程更小的概念。线程是比进程更小的概念。n编写多线程程序涉及到线程类编写多线程程序涉及到线程类Thread。n编写多线程程序有两种方式:一是编写编写多线程程序有两种方式:一是编写Thread子类并构造子类并构造其对象,二是编写实现其对象,二是编写实现Runnable接口的类,再用该类对象接口的类,再用该类对象作参数构造作参数构造
21、Thread对象。对象。n线程的执行路线通过线程的执行路线通过run方法实现。方法实现。n线程按其重要程度分成线程按其重要程度分成10个优先级,缺省是个优先级,缺省是5。n线程的状态可概括为线程的状态可概括为4种:新建、运行、暂停(阻塞及等待)种:新建、运行、暂停(阻塞及等待)、死亡。、死亡。n多线程并发执行,涉及共享的临界资源冲突问题。如公司账多线程并发执行,涉及共享的临界资源冲突问题。如公司账户,工厂产品等,宏观上同时被多个线程使用,但微观上在户,工厂产品等,宏观上同时被多个线程使用,但微观上在某一时刻只能被一个线程独占使用。某一时刻只能被一个线程独占使用。n线程同步与互斥最典型的应用是生
22、产者与消费者模型。线程同步与互斥最典型的应用是生产者与消费者模型。n编写该模型的多线程,要使用关键字编写该模型的多线程,要使用关键字synchronized。/13.7 实训实训13:龟兔赛跑、:龟兔赛跑、生产者与消费者生产者与消费者 n(1)编写龟兔赛跑多线程程序,设赛跑长度为)编写龟兔赛跑多线程程序,设赛跑长度为100米,赛米,赛跑过程中,每跑完跑过程中,每跑完10米输出一次结果。每次运行结果不尽相米输出一次结果。每次运行结果不尽相同,有时乌龟快,有时兔子快。同,有时乌龟快,有时兔子快。n(2)编写生产者消费者多线程程序,设有一个最大库存量)编写生产者消费者多线程程序,设有一个最大库存量为为4的电视机仓库,生产的电视机仓库,生产10台电视机,一边生产一边销售台电视机,一边生产一边销售(消费)。(消费)。/谢谢!谢谢!返回目录 结束放映