线程_IO串讲讲述.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
07-03-01线程_IO串讲 进程是一套顺序执行的指令。 同时开辟并行执行序列即多线程 run() 结束,线程就结束 JVM就是一个进程,在JVM中分出线程 进程数据空间独立;线程数据空间共享, 线程间通信更容易 分配的方式不如线程好,能充分使用CPU的资源。 共享数据就要加锁、解锁,会降低效率。 OS有 时分共享操作系统 和 实时操作系统 时分共享操作系统 时间片 调度系统把每个时间片分给多个进程 性能调优是根据时间片划分, 时间片会影响整个操作系统。 为了让某些工作并行,在进程主线程中开辟多个线程,这就是线程的机制。 我们关心的是被线程共享的数据,主要看synchronized加在何处。往往不加在线程里面,而是在共享的对象上。 只有运行状态的线程才有机会执行代码! 只有等到所有线程终止,进程才结束! 当一个对象分配给某线程锁标记时,其它线程不能访问同步方法,但能访问非同步方法! 起线程的两种方式:1、继承Thread,覆盖run()方法,用start()启动 2、实现Runnable接口,用来构造线程对象。(线程对象不是线程,但代表一个线程) 例子 ProducerConsumer.java 每一个对象都有一个互斥锁标记(monitor),这个锁标记是准备分配给线程的,且只能分配给一个线程 用法一: synchronized(o){ 原子操作代码块 } 哪个线程能拿到o的锁标记,哪个线程才能进入这个同步代码块,用完后释放锁标记 未加同步可能造成数据不一致和数据不完整的缺陷。 用法二: public synchronized void method(){ …} 等价于: Public void method(){ Synchronized(this){...} } 在整个方法中,对this加锁。 构造方法 不能同步,因为还没有当前对象 抽象方法 也不能同步,因为子类覆盖方法后可以是非同步方法,父类就有多余的话。 每一个对象都有一个锁池,装的是等待该对象锁标记的线程。 一个线程可以同时拥有多个对象的锁标记 synchronized(o1){ //同步代码块是可以嵌套的 synchronized(o2){ } } 当一个线程阻塞在A对象的锁池里的时候,不会释放其所拥有的其他对象的锁标记 每个线程不释放自己拥有的资源,却申请别的线程的资源,就可能造成死锁问题 线程t1: o.wait() 前提: 必须在对o加锁的同步代码块里 1. t1会释放其所拥有的所有锁标记 2. t1会进入o的等待队列 线程t2: o.notify() / o.notifyAll() 前提:必须在对o加锁的同步代码块里 t2会从o的等待队列中释放一个线程/所有线程 推荐:尽量用notifyAll取代notify, 因为由OS决定只释放哪个线程 wait() 和 sleep()的联系和区别: 1. wait()是从Object继承下来的方法,而sleep()是Thread中的静态方法 2. wait() 和 sleep()都要阻塞运行,释放CPU资源 3. wait()要释放锁; 而sleep()不释放锁 wait()方法被调用时会解除锁定,但是我们能使用它的地方只是在一个同步方法或代码块内。 新思路:必要时可利用Object中的 锁标记、锁池、等待队列。 用其wait() / notify() 方法, 自己制造临界资源来进行线程间通讯。 (参考字母数字交叉打印的例子TestNumberCharPrint.java) 其中注意o.notifyAll() 和 o.wait() 的调用顺序,还要注意边界问题,体现在最后要来一个判断if(c!=’Z’) o.wait(); 进而让程序正常结束。 I/O流 一、流的分类 (1) 按数据传输方向划分:输入流和输出流 I 输入流 JVM ——数据源 InputXXX O 输出流 JVM —— 数据源 OutputXXX (2) 按数据单位划分:字节流和字符流 字节流 一次传输一个字节 字符流 一次传输一个字符 字节流类: 抽象父类: InputStream 字节输入流 xxxInputStream 实现类: BufferedInputStream 缓冲流——过滤流 ByteArrayInputStream 字节数组流——节点流

文档评论(0)

0520 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档