`
windy2coast
  • 浏览: 55766 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

java笔记四

    博客分类:
  • Java
阅读更多

程序是计算机指令的集合,它以文件的形式存储在磁盘上。
进程:是一个程序在其自身的地址空间中的一次执行活动。
进程是资源申请、调度和独立运行的单位,因此,它使用系统中的运行资源;而程序不能申请系统资源,不能被系统调度,也不能作为独立运行的单位,因此,它不占用系统的运行资源。
线程:是进程中的一个单一的连续控制流程。一个进程可以拥有多个线程。
线程又称为轻量级进程,它和进程一样拥有独立的执行控制,由操作系统负责调度,区别在于线程没有独立的存储空间,而是和所属进程中的其它线程共享一个存储空间,这使得线程间的通信远较进程简单。


实现多线程程序的两种方式:
    (1)从Thread类继承;
    (2)实现Runnable接口。


Java运行时系统实现了一个用于调度线程执行的线程调度器,用于确定某一时刻由哪一个线程在CPU上运行。
在java技术中,线程通常是抢占式的而不需要时间片分配进程(分配给每个线程相等的CPU时间的进程)。抢占式调度模型就是许多线程处于可以运行状态(等待状态),但实际上只有一个线程在运行。该线程一直运行到它终止进入可运行状态(等待状态),或者另一个具有更高优先级的线程变成可运行状态。在后一种情况下,低优先级的线程被高优先级的线程抢占,高优先级的线程获得运行的机会。
Java线程调度器支持不同优先级线程的抢先方式,但其本身不支持相同优先级线程的时间片轮换。
Java运行时系统所在的操作系统(例如:Windows2000)支持时间片的轮换,则线程调度器就支持相同优先级线程的时间片轮换。

线程的同步:
The code segments within a program that access the same object from separate, concurrent threads are called “critical sections”。
同步的两种方式:同步块和同步方法
每一个对象都有一个监视器,或者叫做锁。
同步方法利用的是this所代表的对象的锁。
每个class也有一个锁,是这个class所对应的Class对象的锁。

线程的死锁
哲学家进餐的问题
线程1锁住了对象A的监视器,等待对象B的监视器,线程2锁住了对象B的监视器,等待对象A的监视器,就造成了死锁。


每一个对象除了有一个锁之外,还有一个等待队列(wait set),当一个对象刚创建的时候,它的对待队列是空的。
我们应该在当前线程锁住对象的锁后,去调用该对象的wait方法。
当调用对象的notify方法时,将从该对象的等待队列中删除一个任意选择的线程,这个线程将再次成为可运行的线程。
当调用对象的notifyAll方法时,将从该对象的等待队列中删除所有等待的线程,这些线程将成为可运行的线程。
wait和notify主要用于producer-consumer这种关系中。

 

Test.java

java 代码
  1. /*wait  
  2.  public final void wait()  
  3.  throws InterruptedException导致当前的线程等待,  
  4.  直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法。换句话说,  
  5.  此方法的行为就好像它仅执行 wait(0) 调用一样。   
  6.  当前的线程必须拥有此对象监视器。该线程发布对此监视器的所有权并等待,  
  7.  直到其他线程通过调用 notify 方法,或 notifyAll 方法通知在此对象的监视器上等待的线程醒来。  
  8.  然后该线程将等到重新获得对监视器的所有权后才能继续执行。 */  
  9.   
  10. /*  
  11.  * notify  
  12.  public final void notify()唤醒在此对象监视器上等待的单个线程。  
  13.  如果所有线程都在此对象上等待,则会选择唤醒其中一个线程。选择是任意性的  
  14.  ,并在对实现做出决定时发生。线程通过调用其中一个 wait 方法,在对象的监视器上等待。   
  15.  直到当前的线程放弃此对象上的锁定,才能继续执行被唤醒的线程。被唤醒的线程将以常规方式  
  16.  与在该对象上主动同步的其他所有线程进行竞争;例如,  
  17.  唤醒的线程在作为锁定此对象的下一个线程方面没有可靠的特权或劣势。   
  18.  
  19.  此方法只应由作为此对象监视器的所有者的线程来调用。通过以下三种方法之一,  
  20.  线程可以成为此对象监视器的所有者:   
  21.  
  22.  通过执行此对象的同步 (Sychronized) 实例方法。   
  23.  通过执行在此对象上进行同步的 synchronized 语句的正文。   
  24.  对于 Class 类型的对象,可以通过执行该类的同步静态方法。   
  25.  一次只能有一个线程拥有对象的监视器。   
  26.  
  27.  */  
  28.   
  29. //wait notify在同步 (Sychronized) 方法中调用,必须是同一对象的等待队列   
  30.   
  31.   
  32. public class Test {   
  33.  public static void main(String[] args) {   
  34.   Queue q = new Queue();   
  35.   Producer p = new Producer(q);   
  36.   Consumer c = new Consumer(q);   
  37.   p.start();   
  38.   c.start();   
  39.  }   
  40.   
  41. }   
  42.   
  43. class Queue {   
  44.  int value;   
  45.   
  46.  boolean bFull = false;// 放置处是否有数据   
  47.   
  48.  public synchronized void put(int i) {   
  49.   if (!bFull) {// 如果没有数据   
  50.    value = i;// 放入参数数据   
  51.    bFull = true;// 设置放置位为有数据   
  52.    notify();// 通知在wait()线程   
  53.   }   
  54.   try {// if没有执行,即放置位置已经有数据   
  55.    wait();// 等待(等位置为空的时候再put()数据进去)   
  56.   } catch (Exception e) {   
  57.    e.printStackTrace();   
  58.   }   
  59.   
  60.  }   
  61.   
  62.  public synchronized int get() {   
  63.   if (!bFull) {// 放置位置没有数据   
  64.    try {   
  65.     wait();// 等待   
  66.    } catch (Exception e) {   
  67.     e.printStackTrace();   
  68.    }   
  69.   }   
  70.   bFull = false;// if没执行,即有数据,读取数据后将标志位置false   
  71.   // 即读取了数据后可以再放数据到放置位了   
  72.   notify();// 通知在wait()的线程   
  73.   return value;   
  74.   
  75.  }   
  76. }   
  77.   
  78. class Producer extends Thread {   
  79.  Queue q;   
  80.   
  81.  Producer(Queue q) {   
  82.   this.q = q;   
  83.   
  84.  }   
  85.   
  86.  public void run() {   
  87.   for (int i = 0; i < 10; i++) {   
  88.    q.put(i);//调用put()   
  89.    System.out.println("Producer put" + i);   
  90.   }   
  91.  }   
  92. }   
  93.   
  94. class Consumer extends Thread {   
  95.  Queue q;   
  96.   
  97.  Consumer(Queue q) {   
  98.   this.q = q;   
  99.  }   
  100.   
  101.  public void run() {   
  102.   while (true) {   
  103.    System.out.println("Consumer get" + q.get());//调用get()   
  104.   }   
  105.  }   
  106. }   
  107.   
分享到:
评论

相关推荐

    java笔记java笔记

    java笔记java笔记java笔记java笔记java笔记java笔记java笔记

    Java学习笔记学习笔记

    Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习...

    java笔记 java笔记

    Java提供了四种访问修饰符:`public`、`private`、`protected`和`default`,用于控制类、方法和变量的可见性。 ##### 6.7 构造方法 构造方法是一种特殊的方法,用于初始化对象。 ##### 6.8 封装 封装是指隐藏...

    宋红康java笔记.rar

    【宋红康java笔记】是一份综合性的Java学习资料,由知名编程教育者宋红康编撰。这份压缩包文件包含了大量的Java编程知识点,旨在帮助初学者和有经验的开发者深入理解和掌握Java语言的核心概念与高级特性。以下是根据...

    Java笔记桌面程序

    【Java笔记桌面程序】 在IT领域,开发个人定制的桌面应用程序是解决特定需求的有效方法。本项目名为"Java笔记桌面程序",它是由一个热衷于编程的开发者为解决其所在公司无法使用网络笔记客户端的问题而自创的。这个...

    非常好的java笔记适合初学者

    这份"非常好的java笔记"无疑是初学者踏入这个领域的宝贵资源。笔记由培训班的专业老师编写,内容详细且全面,旨在帮助初学者系统地学习和理解Java的基础知识。 首先,Java基础部分会涵盖变量、数据类型、运算符、...

    大佬的java笔记

    专业的Java笔记可能会涉及这些内容,帮助学习者掌握Java的最新发展。 遗憾的是,由于【部分内容】部分不包含实际的笔记内容,无法进一步提供具体的编程示例和深入的解释。如果要学习Java,最好的方式是从学习Java的...

    java笔记.zip

    2020-4-6 java笔记 ---内部类 2020-4-6 java笔记 ---异常 2020-4-6 java笔记 --多线程 2020-4-8 java笔记 String类 2020-4-9 java 比较器 2020-4-10 java笔记 枚举类 2020-4-10 java 注解(Annotation) 2020-4-11 ...

    java读书笔记笔记笔记笔记笔记笔记

    【标题】"java读书笔记笔记笔记笔记笔记笔记" 暗示了这是一份关于Java编程语言的学习笔记,可能包含了作者在阅读Java相关书籍时所做的重要记录和理解。笔记通常涵盖了语言的基础概念、核心特性、类与对象、内存管理...

    狂神说Java笔记资料

    《狂神说Java笔记资料》是一份全面涵盖Java开发基础知识的文档集,旨在帮助学习者系统地掌握Java编程。这份笔记包含多个章节,每个章节都深入讲解了一个特定的主题,覆盖了从初学者到进阶开发者必备的知识点。 1. *...

    java全套笔记 来自狂神说java笔录.zip

    【Java笔记内容概览】 1. **基础语法**:涵盖变量、数据类型、运算符、流程控制(条件语句、循环语句)、数组、字符串等基础知识。 2. **面向对象**:讲解类、对象、封装、继承、多态等核心概念,以及构造函数、...

    java笔记整理,java课堂笔记

    全套java笔记整理,侧边栏目录结构方便查看,纯手工整理。达内笔记整理。 已整理成带侧边栏目录的网页结构,方便复习大纲和跳转查看。大部分都带有笔记代码。 (默认设置为深珊瑚蓝色调,不喜欢可以把配置文件里的...

    java超强笔记

    "Java超强笔记"正是一份专为新手准备的学习资源,它全面涵盖了从Java环境的搭建到软件设计的各种概念,旨在提供一个易读且系统的学习路径。 首先,笔记可能会从Java的起源和发展开始介绍,让你了解这门语言的历史...

    java笔记本

    java笔记java笔记java笔记java笔记java笔记java笔记java笔记java笔记

    尚硅谷JAVA基础笔记吐血整理

    “尚硅谷JAVA基础笔记”涵盖了Java语言的基础知识,包括语言概述、基本语法、面向对象概念、封装、继承和多态,以及一些关键概念如形参与实参、属性与局部变量、构造器、this关键字、包和MVC设计模式的使用。...

    Java基础 学习笔记 Markdownr版

    4. 多线程:在10多线程.md中,介绍了如何创建和管理Java线程,包括Thread类、Runnable接口,以及同步机制如synchronized关键字、wait()、notify()和notifyAll()方法。多线程技术是实现并发执行的关键,有助于提高...

    java学习笔记 传智博客java笔记

    详细的描述了java的基本知识,配合看java视频更好了。 笔记中有集合,泛型,线程,的详细案例,还有java.net的资料

    java学习笔记markdown

    【Java学习笔记Markdown版】是针对Java初学者和进阶者的一份详尽教程,以Markdown格式编写,便于阅读和整理。Markdown是一种轻量级的标记语言,它允许用户使用易读易写的纯文本格式编写文档,然后转换成结构化的HTML...

    韩顺平java笔记完整版.zip(无笔记,只是代码)

    【标题】"韩顺平java笔记完整版.zip(无笔记,只是代码)"指的是一个包含韩顺平老师Java教学视频中所有代码的压缩文件。这个压缩包不包含笔记,而是专注于提供实际的编程示例,使得学习者可以直接查看和学习Java编程...

    李兴华java笔记

    4. **IO流**:Java的输入/输出流系统提供了丰富的功能,用于读写文件、网络通信等。笔记会讲解流的分类、缓冲流、字符流与字节流的区别,以及NIO(非阻塞I/O)的相关知识。 5. **多线程**:Java支持多线程编程,...

Global site tag (gtag.js) - Google Analytics