1. 1、本文档共22页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
13线程

Java程序设计 赵志崑 山东财政学院计算机信息工程学院 zhaozk@sdfi.edu.cn 线程概念 相关概念 线程(Thread):一段运行着的程序。 进程(Process):Windows下和Unix下含义不同 Windows下,进程指一个运行着的程序。 Unix下,进程指有独立数据区的一段程序。 任务(Task): Windows下和Unix下含义不同 Windows下,任务等同于进程。 Unix下,任务指一个运行的程序。 线程的优缺点 线程的优点: 能够定义流程上相互独立的作业,彼此之间互不干扰。系统将自动决定应该在何时执行哪些作业,这样(从外部看来)它们好象是同时运行的,便于程序的编写和流程控制。尤其是网络通信程序。 有多个处理器的系统中,多个线程可以真正并行执行。 与进程相比,线程没有自己的数据区,所以资源和切换的开销都小;所有线程都使用系统的公共数据区,所以数据交互也方便。 线程的缺点: 因为所有线程共享一个数据区和程序占用的所有资源,所以当两个以上的线程使用同一个资源时,容易引起冲突。 Java对线程的支持: 创建线程非常简单; 也提供了对冲突解决的支持。 用Thread类创建线程 创建线程的方法: 由Thread类派生一个类,覆盖其public void run()方法; 创建一个该类的对象,调用对象的start方法。 注:线程运行完后会自动正常退出。 用Runnable接口创建线程 线程不只可以通过继承自Thread的类来创建,还可以用Runnable接口来创建。 Runnable接口适合用在下面的情况: 类已经有了父类,不能再从Thread类派生; 为一个类实现Runnable接口,在其run方法中可以访问类中的数据。 多线程并发 如果有多个线程在执行,但CPU只有一个,到底是如何执行的? 如果一个线程连续占用CPU时间过长,则其它线程得不到执行,系统会强行切换执行其他线程。(强制剥夺) 例MultiThread1.java:同时创建两个连续输出字符串的线程。 如果一个线程目前没有事情可做,CPU可以去执行其他线程。(主动放弃) 例MultiThread2.java:将两个线程改为都是每隔10毫秒输出一个字符串。 时间间隔用Thread类的静态方法sleep(int microSecond)实现。 注意捕获异常。 如果是用Thread类来创建线程,可以直接调用sleep(10)。 如果是用Runnable接口来创建线程,应该调用Thread.sleep(10)。 这是由操作系统的线程调度机制决定的,不同操作系统调度机制不同。一般无法精确预料指令的执行顺序,所以在设计多线程程序时要特别注意。 线程的状态 线程的状态有下面四种: 新线程:刚刚用new操作符创建了一个线程对象,代码尚未开始执行;此时可以进行一些数据设置。 可运行:新线程调用start方法后,就成为可运行的,参与到整个线程调度中,有资格获得CPU来执行。可运行的线程可以正在运行,也可以不运行。 被中断:可运行的线程因为某些原因无法继续运行,就进入被中断状态,当某些条件满足后,再重新回到可运行状态。 死线程:当线程的run方法运行结束,或者出现了未捕获的异常时,可运行的线程成为死线程。 Java程序运行时的线程模型 Java程序运行时,自动创建三个线程: main函数是一个单独的线程,由此也可以推断,所有代码都是在某个线程中执行。 每个程序有一个事件处理线程,负责调用相应事件监听器的相应的方法。 垃圾回收是由一个后台线程执行的。 事件处理线程 事件处理线程负责依次调用事件队列中的待处理操作。因为所有的事件处理都使用这一个线程,所以要一个事件处理完才能处理另一个事件。 示例EventHandle1: 在事件监听器中,每隔1秒输出一行字符串,共循环5次。 启示:事件监听器中的程序要尽量少占用时间。 事件处理中进行耗时工作 如果事件处理中需要进行耗时的工作,应该启动新的线程来做,从而让事件处理线程可以处理其他事件。 用线程进行用户界面编程 Swing组件不是线程安全(thread safe)的。 用户界面是响应repaint事件而绘制的,所以是在事件处理线程中绘制的。 由于操作系统的调度,线程的指令执行序列是无法精确预知的。 如果在其他线程中操作Swing组件的属性,将会有不可预知的异常产生。 示例:(源代码见SwingTest1.java) 窗口中有一个JList组件; 有两个线程,各自随机地向JList中添加或删除元素(删除时保证组件中有元素可以删除); 运行时将不一定在什么时候产生异常,类型为OutOfBounds。 若将线程改为一个,则不会产生异常(实际是概率大大降低)。 在线程中安全使用Swing组件 如果需要在线程中操作Swing组件,

文档评论(0)

wf93679 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档