十、java多线程

上传人:wm****3 文档编号:53762515 上传时间:2018-09-05 格式:PPT 页数:37 大小:310.50KB
返回 下载 相关 举报
十、java多线程_第1页
第1页 / 共37页
十、java多线程_第2页
第2页 / 共37页
十、java多线程_第3页
第3页 / 共37页
十、java多线程_第4页
第4页 / 共37页
十、java多线程_第5页
第5页 / 共37页
点击查看更多>>
资源描述

《十、java多线程》由会员分享,可在线阅读,更多相关《十、java多线程(37页珍藏版)》请在金锄头文库上搜索。

1、Java多线程,教学目标,进程和线程的异同点 多线程的概念 创建线程的方法和线程类编程 线程控制与Object类中的方法使用,进程和线程引入,进程一般是对操作系统而言的。例如,你打开word编辑文档,同时打开outlook收取邮件。我们可以说这时系统内有两个进程在运行。即多个程序几乎在同一时间执行多个任务。 线程一般是对某一程序而言的。如上例,你打开outlook收新邮件的同时,还可以看已下载的邮件,这两件事没有相互干扰,那么我们说此时这一程序中至少有两个线程在运行。即每一个程序似乎在同一时间内执行多个任务。,多线程基本概念,从逻辑的观点来看,多线程意味着一个程序的多行语句同时执行,但是多线程

2、并不等于多次启动一个程序,操作系统也不会把每个线程当作独立的进程来对待:两者的粒度不同,是两个不同层次上的概念。进程是由操作系统来管理的,而线程则是在一个程序(进程)内。 (可以看看winxp的任务管理器)不同进程的代码、内部数据和状态都是完全独立的,而一个程序内的多线程是共享同一块内存空间和同一组系统资源,有可能互相影响。线程本身的数据通常只有寄存器数据,以及一个程序执行时使用的堆栈,所以线程的切换比进程切换的负担要小。,多线程基本概念,为什么要多线程,1、浏览器必须可以同时下载多个图像和网页。 2、Outlook必须让我一边下载新邮件,一边可以看已下载的邮件。 3、我要用网络蚂蚁或者BT工

3、具下载软件 4、我们的Web服务器必须用多线程支持,多线程基本概念,多线程的优势:减轻编写交互频繁、涉及面多的程序的困难(如监听网络端口)。程序的吞吐量会得到改善(同时监听多种设备,如网络端口、串口、并口以及其他外设)。有多个处理器的系统,可以并发运行不同的线程(否则,任何时刻只有一个线程在运行)。,如果没有线程,一个浏览器中想一边下载图片,一边下载歌曲,但是下载图片需要很长时间,而且出现停滞状态,这时会发生什么?银行转账系统从A帐户向B帐户转账,A帐户减一百同时B帐户加一百,如果A帐户转账出现问题,B帐户能及时停止吗?,进程和线程的差别,这是学习线程必须搞清楚的问题。这是一个所有的java技

4、术面试都会问的问题: Hi,请您谈谈进程和线程有什么区别?,创建线程的方式,Java 有两种方式可以使应用程序员比较容易地实现多线程编程。 继承Thread类 实现Runnable接口,创建线程的方式,方法一:继承Thread类 定义一个线程类,它继承类Thread并重写其中的方法run()。例如:class CMyThread extends Threadpublic void run()/你想做的事情,可以放在循环中,让其一直执行 CMyThread mythread=new CMyThread(); Mythead.start(); /启动一个线程,Java.lang.Thread,st

5、atic void sleep(long millis)睡眠规定的毫秒数 void run()必须覆盖,添加想要的代码 void start()启动线程,将导致run()被调用。该方法将立即返回,新线程将并行运行。,继承Thread类创建线程的步骤,、继承Thread 、覆盖Thread的run()方法,将你要让线程做的事写在run方法中。有时候可以需要用循环,使你的代码一直执行下去。 、New 这个Thead子类,得到一个对象 、调用这个对象的start()方法。 、线程被启动,开始执行run()中的代码。,例子,public class Timer extends Thread /定时类T

6、imer继承Thread类 int time=0; /定时变量初始化值为0秒 public Timer(int time) / Timer类构造方法,构造方法的参数为需要定时的时间(单位为 /秒)。 this.time=time; public void run() /Timer重写父类Thread 的方法run(),这是该线程运行的程序段 try for(int i=0;itime;i+ ) Thread.sleep(1000); /线程睡眠1秒,这期间它不执行,好象停止在这里一样 System.out.println(i); /屏幕显示i值,i表示时间间隔数,这里表示秒数 catch(Ex

7、ception e) /捕获异常 System.out.println(e.toString(); /异常处理,屏幕显示异常信息 ,例子,public static void main(String args) /主线程对应的运行程序 Timer timer=new Timer(10); /构造Timer的对象timer,设置定时10秒 timer.start(); /启动线程timer运行 这个例子实现一个定时线程,即线程在给定期间每隔一定时间(1秒),屏幕显示时间累计数(秒数),时间结束时线程自动停止、撤消。,创建线程的方式,方法二:实现Runnable接口由于继承了Thread后,类再不

8、能继承别的类,所以一般我们采用实现unnable接口的方法来创建线程。 。提供一个实现接口Runnable的类,实现run()方法。 。 。得到这个类的实例A。 3。 New 这个一个Thread对象,同时A作为参数传入。例如:Thread runner=new Thread(A); 4。调用start启动线程例如:runner.start();,例子,public class Timer implements Runnable int time=0; public Timer(int time) this.time=time; public void run() /Timer必须要实现接口r

9、un() try for(int i=0;itime;i+) /循环睡眠 Thread.sleep(1000); /睡眠1秒 System.out.println(“i=”+i); catch(Exception e) System.out.println(e.toString(); ,例子,public static void main(String args) Timer timer=new Timer(10); /构造Timer的对象timer,定时10秒 Timer.run(); /使用run()启动线程运行 这个例子与刚才哪个例子不同点在于要实现Runable接口,必须实现run()

10、方法,否则将不能通过编译。而继承Thread类的线程机制则不一定要重载其run( )方法,线程类将自动调用其基类的run( )方法,一个奇怪的程序,1。有一个Counter类,有一个成员变量int i=0; 2。一个线程对I进行+运算,循环1000次,另一个线程对I进行-运算,也循环1000次,最后的结果是多少?,原因:,两个线程并非顺序交替执行; 在sleep时,两个线程获得的counter值出现不一致。其中有一个是旧的。 必须让一个线程的getCounter()和setCounter都执行完,才能让另一个执行。 有何方法?,同步关键字synchronized,public void run

11、() for(int i=0;i0)counter-;/减一System.out.println(“r:“+counter);notify();elsetry wait(); catch(InterruptedException e) public synchronized void write()if(counter0) try wait();catch(InterruptedException e)elseSystem.out.println(“W:“+counter);counter=counter+10;/加10notify();,Wait(),1.wait()方法是Object对象的方法,而不是Thread的方法。 2.wait()方法只可能在synchronized块中被调用。 .wait()被调用时,原来的锁对象打开锁,线程进入阻塞状态,进入该对象的等待列表。直到被另一线程notify(),它才会从列表中出来。 .被notify()唤醒的线程从wait()后面的代码开始继续执行。,

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 社会民生

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号