java基础学习第8章.ppt
《java基础学习第8章.ppt》由会员分享,可在线阅读,更多相关《java基础学习第8章.ppt(74页珍藏版)》请在三一办公上搜索。
1、第八章 线程,郑 莉,JAVA语言程序设计,2,目录,多线程编程基础线程的生命周期线程的优先级本章小结,3,8.1 多线程编程基础,本节内容线程的概念Thread类Runnable接口线程间的数据共享多线程的同步控制线程之间的通信后台线程,4,8.1.1 线程的概念,进程和线程的区别进程一个独立程序的每一次运行称为一个进程,例如用字处理软件编辑文稿时,同时打开mp3播放程序听音乐,这两个独立的程序在同时运行,称为两个进程设置一个进程要占用相当一部分处理器时间和内存资源大多数操作系统不允许进程访问其他进程的内存空间,进程间的通信很不方便,编程模型比较复杂,多线程编程基础,5,线程一个程序中多段代
2、码同时并发执行,称为多线程通过多线程,一个进程表面上看同时可以执行一个以上的任务并发创建线程比创建进程开销要小得多,线程之间的协作和数据交换也比较容易Java是第一个支持内置线程操作的主流编程语言多数程序设计语言支持多线程要借助于操作系统“原语(primitives)”,8.1.1 线程的概念(续),多线程编程基础,6,8.1.2 Thread类,Thread类在Java程序中创建多线程的方法之一是继承Thread类 封装了Java程序中一个线程对象需要拥有的属性和方法从Thread类派生一个子类,并创建这个子类的对象,就可以产生一个新的线程。这个子类应该重写Thread类的run方法,在ru
3、n方法中写入需要在新线程中执行的语句段。这个子类的对象需要调用start方法来启动,新线程将自动进入run方法。原线程将同时继续往下执行Thread类直接继承了Object类,并实现了Runnable接口。它位于java.lang包中,因而程序开头不用import任何包就可直接使用,多线程编程基础,7,8.1.2 Thread类(续)例8_1,在新线程中完成计算某个整数的阶乘public class Ex8_1 public static void main(String args)System.out.println(main thread starts);FactorialThread t
4、hread=new FactorialThread(10);thread.start();System.out.println(main thread ends);class FactorialThread extends Thread private int num;public FactorialThread(int num)this.num=num;,多线程编程基础,8,public void run()int i=num;int result=1;System.out.println(new thread started);while(i0)result=result*i;i=i-1;
5、System.out.println(The factorial of+num+is+result);System.out.println(new thread ends);运行结果main thread startsmain thread endsnew thread startedThe factorial of 10 is 3628800new thread ends,8.1.2 Thread类(续)例8_1运行结果,多线程编程基础,9,结果说明main线程已经执行完后,新线程才执行完main函数调用thread.start()方法启动新线程后并不等待其run方法返回就继续运行,thre
6、ad.run函数在一边独自运行,不影响原来的main函数的运行源程序修改如果启动新线程后希望主线程多持续一会再结束,可在start语句后加上让当前线程(这里当然是main)休息1毫秒的语句:try Thread.sleep(1);catch(Exception e);,8.1.2 Thread类(续)例8_1修改,多线程编程基础,10,修改后运行结果main thread startsnew thread staredThe factorial of 10 is 3628800new thread endsmain thread ends运行结果说明新线程结束后main线程才结束,8.1.2
7、Thread类(续)例8_1修改后运行结果,多线程编程基础,11,8.1.2 Thread类(续)常用API函数,多线程编程基础,12,8.1.2 Thread类(续)常用API函数,多线程编程基础,13,8.1.2 Thread类(续)常用API函数,多线程编程基础,14,创建3个新线程,每个线程睡眠一段时间(06秒),然后结束public class Ex8_2 public static void main(String args)/创建并命名每个线程 TestThread thread1=new TestThread(thread1);TestThread thread2=new Te
8、stThread(thread2);TestThread thread3=new TestThread(thread3);System.out.println(Starting threads);thread1.start();/启动线程1 thread2.start();/启动线程2 thread3.start();/启动线程3 System.out.println(Threads started,main endsn);,8.1.2 Thread类(续)例8_2,多线程编程基础,15,class TestThread extends Thread private int sleepTime
9、;public TestThread(String name)super(name);sleepTime=(int)(Math.random()*6000);public void run()try System.out.println(getName()+going to sleep for+sleepTime);Thread.sleep(sleepTime);/线程休眠 catch(InterruptedException exception);System.out.println(getName()+finished,8.1.2 Thread类(续)例8_2,多线程编程基础,16,运行结
10、果Starting threadsThreads started,main endsthread1 going to sleep for 3519thread2 going to sleep for 1689thread3 going to sleep for 5565thread2 finishedthread1 finishedthread3 finished说明由于线程3休眠时间最长,所以最后结束,线程2休眠时间最短,所以最先结束每次运行,都会产生不同的随机休眠时间,所以结果都不相同,8.1.2 Thread类(续)例8_2运行结果,多线程编程基础,17,8.1.3 Runnable接口
11、,Runnable接口Java多线程机制的一个重要部分,实际上它只有一个run()方法Thread类实现了Runnable接口,相对于Thread类,它更适合于多个线程处理同一资源实现Runnable接口的类的对象可以用来创建线程,这时start方法启动此线程就会在此线程上运行run()方法在编写复杂程序时相关的类可能已经继承了某个基类,而Java不支持多继承,在这种情况下,便需要通过实现Runnable接口来生成多线程,多线程编程基础,18,使用Runnable接口实现例8_1功能public class Ex8_1 public static void main(String args)S
12、ystem.out.println(main thread starts);FactorialThread t=new FactorialThread(10);new Thread(t).start();System.out.println(new thread started,main thread ends);,8.1.3 Runnable接口(续)例8_3,多线程编程基础,19,class FactorialThread implements Runnable private int num;public FactorialThread(int num)this.num=num;publ
13、ic void run()int i=num;int result=1;while(i0)result=result*i;i=i-1;System.out.println(The factorial of+num+is+result);System.out.println(new thread ends);,8.1.3 Runnable接口(续)例8_3,多线程编程基础,20,使用Runnable接口实现例8_2功能public class Ex8_4 public static void main(String args)TestThread thread1=new TestThread()
14、;TestThread thread2=new TestThread();TestThread thread3=new TestThread();System.out.println(Starting threads);new Thread(thread1,Thread1).start();new Thread(thread2,Thread2).start();new Thread(thread3,Thread3).start();System.out.println(Threads started,main endsn);,8.1.3 Runnable接口(续)例8_4,多线程编程基础,21
15、,class TestThread implements Runnable private int sleepTime;public TestThread()sleepTime=(int)(Math.random()*6000);public void run()try System.out.println(Thread.currentThread().getName()+going to sleep for+sleepTime);Thread.sleep(sleepTime);catch(InterruptedException exception);(Thread.currentThrea
16、d().getName()+finished);,8.1.3 Runnable接口(续)例8_4,多线程编程基础,22,8.1.4 线程间的数据共享,代码共享多个线程的执行代码来自同一个类的run方法时,即称它们共享相同的代码数据共享当共享访问相同的对象时,即它们共享相同的数据使用Runnable接口可以轻松实现多个线程共享相同数据,只要用同一个实现了Runnable接口的实例作为参数创建多个线程就可以了,多线程编程基础,23,修改例8_4,只用一个Runnable类型的对象为参数创建3个新线程。public class Ex8_5 public static void main(String
17、 args)TestThread threadobj=new TestThread();System.out.println(Starting threads);new Thread(threadobj,Thread1).start();new Thread(threadobj,Thread2).start();new Thread(threadobj,Thread3).start();System.out.println(Threads started,main endsn);,8.1.4 线程间的数据共享(续)例8_5,多线程编程基础,24,class TestThread impleme
18、nts Runnable private int sleepTime;public TestThread()sleepTime=(int)(Math.random()*6000);public void run()try System.out.println(Thread.currentThread().getName()+going to sleep for+sleepTime);Thread.sleep(sleepTime);catch(InterruptedException exception);System.out.println(Thread.currentThread().get
19、Name()+finished);,8.1.4 线程间的数据共享(续)例8_5,多线程编程基础,25,运行结果Starting threadsThread1 going to sleep for 966Thread2 going to sleep for 966Threads started,main endsThread3 going to sleep for 966Thread1 finishedThread2 finishedThread3 finished说明因为是用一个Runnable类型对象创建的3个新线程,这三个线程就共享了这个对象的私有成员sleepTime,在本次运行中,三个
20、线程都休眠了966毫秒,8.1.4 线程间的数据共享(续)例8_5运行结果,多线程编程基础,26,8.1.4 线程间的资源共享(续),独立的同时运行的线程有时需要共享一些数据并且考虑到彼此的状态和动作例如生产/消费问题:生产线程产生数据流,然后这些数据流再被消费线程消费假设一个Java应用程序,其中有一个线程负责往文件写数据,另一个线程从同一个文件中往出都数据,因为涉及到同一个资源,这里是同一个文件,这两个线程必须保证某种方式的同步,多线程编程基础,27,用三个线程模拟三个售票口,总共出售200张票用3个线程模仿3个售票口的售票行为这3个线程应该共享200张票的数据public class E
21、x8_6public static void main(String args)SellTickets t=new SellTickets();new Thread(t).start();new Thread(t).start();new Thread(t).start();,多线程编程基础,8.1.4 线程间的数据共享(续)例8_6,28,class SellTickets implements Runnableprivate int tickets=200;public void run()while(tickets0)System.out.println(Thread.currentTh
22、read().getName()+is selling ticket+tickets-);,8.1.4 线程间的数据共享(续)例8_6,多线程编程基础,29,运行结果选最后几行如下Thread-2 is selling ticket 6Thread-1 is selling ticket 5Thread-0 is selling ticket 4Thread-2 is selling ticket 3Thread-1 is selling ticket 2Thread-0 is selling ticket 1说明在这个例子中,创建了3个线程,每个线程调用的是同一个SellTickets对象中
23、的run()方法,访问的是同一个对象中的变量(tickets)如果是通过创建Thread类的子类来模拟售票过程,再创建3个新线程,则每个线程都会有各自的方法和变量,虽然方法是相同的,但变量却是各有200张票,因而结果将会是各卖出200张票,和原意就不符了,8.1.4 线程间的数据共享(续)例8_6运行结果,多线程编程基础,30,8.1.5 多线程的同步控制,有时线程之间彼此不独立、需要同步线程间的互斥同时运行的几个线程需要共享一个(些)数据一个线程对共享的数据进行操作时,不允许其他线程打断它,否则会破坏数据的完整性。即被多个线程共享的数据,在某一时刻只允许一个线程对其进行操作“生产者/消费者”
24、问题生产者产生数据,消费者消费数据,具体来说,假设有一个Java应用程序,其中有一个线程负责往数据区写数据,另一个线程从同一数据区中读数据,两个线程可以并行执行(类似于流水线上的两道工序)如果数据区已满,生产者要等消费者取走一些数据后才能再放;而当数据区没有数据时,消费者要等生产者放入一些数据后再取,多线程编程基础,31,用两个线程模拟存票、售票过程 假定开始售票处并没有票,一个线程往里存票,另外一个线程则往出卖票我们新建一个票类对象,让存票和售票线程都访问它。本例采用两个线程共享同一个数据对象来实现对同一份数据的操作public class Ex8_7 public static void
25、main(String args)Tickets t=new Tickets(10);new Consumer(t).start();new Producer(t).start();,8.1.5 多线程的同步控制(续)例8_7,多线程编程基础,32,class Tickets int number=0;/票号int size;/总票数boolean available=false;/表示目前是否有票可售public Tickets(int size)/构造函数,传入总票数参数this.size=size;,8.1.5 多线程的同步控制(续)例8_7,多线程编程基础,33,class Produ
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- java 基础 学习
链接地址:https://www.31ppt.com/p-6509717.html