- 浏览: 81572 次
- 性别:
- 来自: 沈阳
文章分类
最新评论
-
zzw118:
楼主讲解得很好,学习了!
hibernate延迟加载 -
fengwei199181:
不错。
hibernate延迟加载 -
teacher1998:
写得挺全的,格式也蛮好,thanks
Cookie与Session专题 -
wfl888_2007:
谢谢!~ 又回顾了下基础! 看来要经常逛逛! 不然都忘了! ...
CoreJava学习笔记5 -
whaosoft:
基础挺重要的 没事就该看下呢
CoreJava学习笔记5
Java多线程编程
进程,即运行中的程序,多任务操作系统中并发的一个任务(CPU是分时间片执行多个进程的),线程,其本质是进程中顺序的执行流程,进程有独立的进程空间进程中的数据存放空间(对空间和栈空间)是独立的。线程没有独立的存放数据的空间,数据存储空间(堆空间)是共享的,线程间的栈空间是独立的,线程消耗的资源比进程小。
线程,是进程(运行中的程序)中顺序的执行流程,进程可以划分出多个线程。
JVM(java虚拟机)本身就是一个进程,java只能够申请创建线程。
操作系统决定线程是否有优先级,独占式的操作系统中系统会有优先级的概念,共享式的操作系统则不会优先级的。
Java中的线程也是对象,线程类是Thread类,线程是操作系统创建并进行维护的资源,线程对象表示一个线程,本身不是线程。通过线程对象来申请创建,中止线程,访问底层的线程资源。
线程包含了三部分,cpu资源,代码,数据存储空间。
线程对象调用start()方法,线程对象就会向操作系统申请线程启动,除了申请的线程,还有main方法的线程,也就是主线程。
注意:只有运行状态的线程才有机会执行代码,主线程的中止不会影响其他的正在运行中的线程,朱线程中止也就是main()方法退出了。只有进程中的所有线程都中止时,进程(JVM进程)才会退出,只要有线程没有中止,进程就不会退出。
线程编程的两种方法
1, 写一个类,继承Thread类,覆盖Thread类中继承来的run()方法,这样就写好了自定义的线程类。
例:
2,写一个类,实现Runable接口,实现其中的run()方法。这种方法写好的类的对象需要作为线程类创建对象时构造方法的参数。
例:
Thread类的方法
public static void sleep(long millis)
throws InterruptedException
括号中以毫秒为单位, 使线程停止一段时间,间隔期满后,线程不一定立即恢复执行。
当main()运行完毕,即使在结束时时间片还没有用完,CPU也放弃此时间片,继续运行其他程序。
try{
Thread.sleep(1000);
}catch(InterruptedException e){
e.printStackTrace(e);
}
public final void join() throws InterruptedException
表示其他运行线程放弃执行权,进入阻塞状态,直到调用线程结束。
实际上是把并发的线程变为串行运行。
线程的优先级:1-10,越大优先级越高,优先级越高被OS选中的可能性就越大。(不建议使用,因为不同操作系统的优先级并不相同,使得程序不具备跨平台性,这种优先级只是粗略地划分)。
注:程序的跨平台性:除了能够运行,还必须保证运行的结果。
Public static void field()
使当前线程马上交出执行权,回到可运行状态,等待OS的再次调用。
Public final Boolean isActive()
验证当前线程是否是活动的,不管它是否正在运行。
线程的生命周期
下面为线程中的7中非常重要的状态:(有的书上也只有认为前五种状态:而将“锁池”和“等待池”都看成是“阻塞”状态的特殊情况:这种认识也是正确的,但是将“锁池”和“等待池”单独分离出来有利于对程序的理解)
1, 初始状态,线程创建,线程对象调用start()方法。
2,可运行状态,也就是等待Cpu资源,等待运行的状态。
3,运行状态,获得了Cpu资源,正在运行状态。
4,阻塞状态,也就是让出Cpu资源,进入一种等待状态,而且不是可运行状态,有三种情况会进入阻塞状态。
1)如等待输入(输入设备进行处理,而CPU不处理),则放入阻塞,直到输入完毕,阻塞结束后会进入可运行状态。
2)线程休眠,线程对象调用sleep()方法,阻塞结束后会进入可运行状态。
3)线程对象2调用线程对象1的join()方法,那么线程对象2进入阻塞状态,直到线程对象1中止。
5,中止状态,线程执行结束。所有线程都进入中止状态Java虚拟机进程才结束。
6,锁池状态
7,等待队列
共享数据的并发处理
多线程同时并发访问的资源叫做临界资源。
多个线程同时访问对象并要求操作相同资源时分割了原子操作就会出现问题。(原子操作,不可再分的操作)会出现数据的不一致或数据不完整,为避免这种现象采用对访问的线程做限制的方法。
Synchronized关键字
1.Synchronized修饰代码块(同步代码块),
对括号内的对象加锁,只有拿到锁标记的对象才能执行该代码块
2.Synchronized修饰方法
对当前对象的加锁,只有拿到锁标记的对象才能执行该方法。
互斥锁机制,利用每个对象都有一个monitor(锁标记),当线程拥有这个锁标记时才能访问加了同步的这个资源,没有锁标记便进入锁池。任何一个对象系统都会为其创建一个互斥锁,这个锁是为了分配给线程的,防止打断原子操作。每个对象的锁只能分配给一个线程。
注意:构造方法不能Synchronized修饰,静态方法可以用Synchronized修饰(是对类对象加锁,类对象会在反射时讲到)。抽象方法不能用Synchronized修饰,不影响子类覆盖,子类在覆盖这个方法是可以加Synchronized,也可以不加Synchronized,所以根据Java不允许写废代码的特点是不能写在一起。
注意:对当前对象加锁,一个代码块或者方法是同步的(Synchronized),当前对象的锁标记没有分配出去时,这个对象的锁标记为分配时,线程来访问这个代码块,会得到这个对象的锁标记,直到这个线程结束才会释放着个锁标记,其他访问这个代码块或者是方法线程就会进入这个对象锁池,没有得到当前对象的锁标记,不能访问这个代码块或者方法。当一个线程想要获得某个对象锁标记而进入锁池,这个线程又持有其他对象的锁标记,这个线程也不会释放其持有的锁标记。
注:方法的Synchronized特性本身不会被继承。
线程因为未拿到锁标记而发生阻塞进入锁池(lock pool)。每个对象都有自己的一个锁池的空间,用于放置等待运行的线程。由系统决定哪个线程拿到锁标记并运行。
使用互斥锁的注意事项
举例:男孩和女孩例子,每个女孩是一个对象,每个男孩是个线程。每个女孩都有自己的锁池。每个男孩可能在锁池里等待。
注意:只读不用加同步,只写也不用加同步,只有读写操作兼而有之时才加同步。
注意:在java.io包中Vector 和 HashTable 之所以是线程安全的,是因为每个方法都有synchronized修饰。Static 方法可以加 synchronized , 锁的是类对象。但是Vector 是 jdk 1.0 的 ArrayList 是 jdk1.2 所以实际应用还是使用ArrayList。
注意:内同步,外同步,内同步,即,类内的方法加同步(synchronized)修饰,外同步即,在需要控制只能由一个线程进行访问时,把需要控制的方法写在同步代码块里。
进程,即运行中的程序,多任务操作系统中并发的一个任务(CPU是分时间片执行多个进程的),线程,其本质是进程中顺序的执行流程,进程有独立的进程空间进程中的数据存放空间(对空间和栈空间)是独立的。线程没有独立的存放数据的空间,数据存储空间(堆空间)是共享的,线程间的栈空间是独立的,线程消耗的资源比进程小。
线程,是进程(运行中的程序)中顺序的执行流程,进程可以划分出多个线程。
JVM(java虚拟机)本身就是一个进程,java只能够申请创建线程。
操作系统决定线程是否有优先级,独占式的操作系统中系统会有优先级的概念,共享式的操作系统则不会优先级的。
Java中的线程也是对象,线程类是Thread类,线程是操作系统创建并进行维护的资源,线程对象表示一个线程,本身不是线程。通过线程对象来申请创建,中止线程,访问底层的线程资源。
线程包含了三部分,cpu资源,代码,数据存储空间。
线程对象调用start()方法,线程对象就会向操作系统申请线程启动,除了申请的线程,还有main方法的线程,也就是主线程。
注意:只有运行状态的线程才有机会执行代码,主线程的中止不会影响其他的正在运行中的线程,朱线程中止也就是main()方法退出了。只有进程中的所有线程都中止时,进程(JVM进程)才会退出,只要有线程没有中止,进程就不会退出。
线程编程的两种方法
1, 写一个类,继承Thread类,覆盖Thread类中继承来的run()方法,这样就写好了自定义的线程类。
例:
public class Test{ public static void main(String[] args){ Thread t=new A(); t.start(); } class A extends Thread{ public void run(){ ... } }
2,写一个类,实现Runable接口,实现其中的run()方法。这种方法写好的类的对象需要作为线程类创建对象时构造方法的参数。
例:
public class Test{ public static void main(String[] args){ Runable r=new b();//目标对象 Thread t=new Thread(r);//用目标对象构造线程对象 t.start(); } class b implements Runable{ public void run(){ ... } }
Thread类的方法
public static void sleep(long millis)
throws InterruptedException
括号中以毫秒为单位, 使线程停止一段时间,间隔期满后,线程不一定立即恢复执行。
当main()运行完毕,即使在结束时时间片还没有用完,CPU也放弃此时间片,继续运行其他程序。
try{
Thread.sleep(1000);
}catch(InterruptedException e){
e.printStackTrace(e);
}
public final void join() throws InterruptedException
表示其他运行线程放弃执行权,进入阻塞状态,直到调用线程结束。
实际上是把并发的线程变为串行运行。
线程的优先级:1-10,越大优先级越高,优先级越高被OS选中的可能性就越大。(不建议使用,因为不同操作系统的优先级并不相同,使得程序不具备跨平台性,这种优先级只是粗略地划分)。
注:程序的跨平台性:除了能够运行,还必须保证运行的结果。
Public static void field()
使当前线程马上交出执行权,回到可运行状态,等待OS的再次调用。
Public final Boolean isActive()
验证当前线程是否是活动的,不管它是否正在运行。
线程的生命周期
下面为线程中的7中非常重要的状态:(有的书上也只有认为前五种状态:而将“锁池”和“等待池”都看成是“阻塞”状态的特殊情况:这种认识也是正确的,但是将“锁池”和“等待池”单独分离出来有利于对程序的理解)
1, 初始状态,线程创建,线程对象调用start()方法。
2,可运行状态,也就是等待Cpu资源,等待运行的状态。
3,运行状态,获得了Cpu资源,正在运行状态。
4,阻塞状态,也就是让出Cpu资源,进入一种等待状态,而且不是可运行状态,有三种情况会进入阻塞状态。
1)如等待输入(输入设备进行处理,而CPU不处理),则放入阻塞,直到输入完毕,阻塞结束后会进入可运行状态。
2)线程休眠,线程对象调用sleep()方法,阻塞结束后会进入可运行状态。
3)线程对象2调用线程对象1的join()方法,那么线程对象2进入阻塞状态,直到线程对象1中止。
5,中止状态,线程执行结束。所有线程都进入中止状态Java虚拟机进程才结束。
6,锁池状态
7,等待队列
共享数据的并发处理
多线程同时并发访问的资源叫做临界资源。
多个线程同时访问对象并要求操作相同资源时分割了原子操作就会出现问题。(原子操作,不可再分的操作)会出现数据的不一致或数据不完整,为避免这种现象采用对访问的线程做限制的方法。
Synchronized关键字
1.Synchronized修饰代码块(同步代码块),
public void push(char c){ synchronized(this)//只有持有当前对象的锁标记才能访问这个代码块 { ... } }
对括号内的对象加锁,只有拿到锁标记的对象才能执行该代码块
2.Synchronized修饰方法
public synchronized void push(char c) { ... }
对当前对象的加锁,只有拿到锁标记的对象才能执行该方法。
互斥锁机制,利用每个对象都有一个monitor(锁标记),当线程拥有这个锁标记时才能访问加了同步的这个资源,没有锁标记便进入锁池。任何一个对象系统都会为其创建一个互斥锁,这个锁是为了分配给线程的,防止打断原子操作。每个对象的锁只能分配给一个线程。
注意:构造方法不能Synchronized修饰,静态方法可以用Synchronized修饰(是对类对象加锁,类对象会在反射时讲到)。抽象方法不能用Synchronized修饰,不影响子类覆盖,子类在覆盖这个方法是可以加Synchronized,也可以不加Synchronized,所以根据Java不允许写废代码的特点是不能写在一起。
注意:对当前对象加锁,一个代码块或者方法是同步的(Synchronized),当前对象的锁标记没有分配出去时,这个对象的锁标记为分配时,线程来访问这个代码块,会得到这个对象的锁标记,直到这个线程结束才会释放着个锁标记,其他访问这个代码块或者是方法线程就会进入这个对象锁池,没有得到当前对象的锁标记,不能访问这个代码块或者方法。当一个线程想要获得某个对象锁标记而进入锁池,这个线程又持有其他对象的锁标记,这个线程也不会释放其持有的锁标记。
注:方法的Synchronized特性本身不会被继承。
线程因为未拿到锁标记而发生阻塞进入锁池(lock pool)。每个对象都有自己的一个锁池的空间,用于放置等待运行的线程。由系统决定哪个线程拿到锁标记并运行。
使用互斥锁的注意事项
举例:男孩和女孩例子,每个女孩是一个对象,每个男孩是个线程。每个女孩都有自己的锁池。每个男孩可能在锁池里等待。
class Girl{ public void hand(){ } public syncronized void kiss(){ } } class Boy extends Thread{ public void run(){ } }
注意:只读不用加同步,只写也不用加同步,只有读写操作兼而有之时才加同步。
注意:在java.io包中Vector 和 HashTable 之所以是线程安全的,是因为每个方法都有synchronized修饰。Static 方法可以加 synchronized , 锁的是类对象。但是Vector 是 jdk 1.0 的 ArrayList 是 jdk1.2 所以实际应用还是使用ArrayList。
注意:内同步,外同步,内同步,即,类内的方法加同步(synchronized)修饰,外同步即,在需要控制只能由一个线程进行访问时,把需要控制的方法写在同步代码块里。
发表评论
-
在myeclipse下给代码加注释
2010-10-26 14:16 2068给类加注释: 方法一 ... -
Cookie与Session专题
2010-09-30 21:52 970Cookie与Session专题一、coo ... -
内部类的分类
2010-09-29 18:04 13277.11. 内部类(注:所有使用内部类的地方都可以不用内 ... -
Java与中文的问题:char变量可以存中文;中文类名,变量名,方法名
2010-09-29 17:06 1277char容量为16bit,可以存中文 public ... -
如何使用Java解析XML
2010-09-23 00:09 1804XML_day01_pm 1.XML可宽展编辑语言 指令: ... -
JDBC课程笔记
2010-09-23 00:02 1114JDBC_day01_am 1. 2.解耦合 ... -
JDBC中Statement和PreparedStatement的区别
2010-09-22 23:59 999Statement:创建时不传递sql语句;每传入数据库一条s ... -
CoreJava学习心得17
2010-05-01 20:40 887JAVA5.0 的注释 (Annotation) ... -
CoreJava学习心得16
2010-05-01 20:35 968Java5.0的新特性 自动装 ... -
CoreJava学习心得15
2010-05-01 20:30 773反射 反射,在运行时 ... -
CoreJava学习心得14
2010-05-01 20:28 969ObjectInputStream和ObjectOutputS ... -
CoreJava学习心得13
2010-05-01 20:24 8981Java中的I/O 使用I/O流访问file中的内容。 J ... -
CoreJava学习笔记12
2010-05-01 20:23 988死锁问题 多线程不释 ... -
CoreJava学习笔记10
2010-05-01 20:16 747awt事件模型(观察者模式)(重点) 事件模型中,包括事件源 ... -
CoreJava学习笔记9
2010-04-27 22:19 929java中的图形界面 GUI,图形化的用户接口,为了人机交互 ... -
CoreJava学习笔记8
2010-04-27 22:18 954[size=medium] ... -
CoreJava学习笔记7
2010-04-27 22:07 921很重要的一章哦 Java封 ... -
CoreJava学习笔记6
2010-04-26 22:27 1025java中的接口 接口是一种程序结构,是特殊的抽象类。接口中 ... -
CoreJava学习笔记5
2010-04-26 22:21 1044java中的修饰符 static 表示静态,它可以修饰属性, ... -
CoreJava学习笔记4
2010-04-25 18:43 1157面向对象的三大特征:封装、继承、多态 Java中的封装 封 ...
相关推荐
### CoreJava学习笔记 #### 一、JAVA特点与运行原理 **JAVA特点:** 1. **简单性**:Java的设计者们将C++语言中许多不易理解和容易混淆的部分去除,使得Java更容易理解与掌握。 2. **面向对象**:Java几乎一切都...
Java是一种广泛使用的面向对象的编程语言,其基础知识构成了"Core Java"的学习内容。在学习Java时,遵循"多花时间、多动手、多问题"的原则至关重要,因为理论理解与实践操作相结合能更好地掌握知识。 1. **Java语法...
《Core Java》学习笔记。 我把自己的笔记都以注释的形式写在代码里面了,这样方便理解。 尽管有些部分被标记为“已完成”,但实际上以后说不定我还会折返回来进行修改或者添加一些注释。 当然如果你有什么不理解...
CoreJava_day11的学习笔记主要涵盖了集合框架,特别是关于List、Set和Map接口,以及ArrayList、Vector和LinkedList等具体实现类的知识点。 首先,集合框架是用来存放对象的对象,它提供了一组接口和类,使得我们...
Java是一种由Sun Microsystems在1995年推出的高级编程语言,现由Oracle公司维护。...以上就是Core Java学习笔记的主要内容概述,涵盖了从基础语法到高级特性的广泛知识,为深入理解和应用Java打下了坚实的基础。
这篇学习笔记主要讨论了Java集合框架,包括Collection、List、Set和Map四大接口以及它们的相关方法。 首先,Collection是所有集合类的顶级接口,它定义了一些基本的操作,如添加元素(add)、获取元素数量(size)、...
简介 《Core Java》学习笔记。 我把自己的笔记都以注释的形式写在代码里面了,这样方便理解。 尽管有些部分被标记为“已完成”,但实际上以后说不定我会折返回来进行修改或者添加一些注释。 当然如果你有什么不明白...
在Java编程语言中,SortedSet接口是Set接口的一个子接口,它添加了对集合元素排序的能力。SortedSet接口要求其实现类必须维护元素的排序顺序,这种顺序可以是元素的自然顺序(即元素自身可比较),也可以是通过提供...
Java是世界上最流行的编程语言之一,...以上就是“达内Core Java学习笔记”中涉及的主要知识点。通过深入学习和实践,初学者可以逐步建立起坚实的Java编程基础,并为进一步学习Java的高级特性和框架打下坚实的基础。
CoreJava DAY11 内部类 70 CoreJava DAY12 集合 List 78 CoreJava DAY13 集合 Set 85 CoreJava DAY14 集合 Map 92 CoreJava DAY15 异常、断言 98 CoreJava DAY16 反射、注释 108 CoreJava DAY17 GUI 120 CoreJava ...
《CoreJava学习笔记》 Java,作为一种广泛使用的高级编程语言,以其独特的特性和优势深受开发者喜爱。本学习笔记旨在深入浅出地介绍Java的核心概念,帮助初学者快速掌握这一强大的工具。 1. Java特点 Java语法...
CoreJava全套详细笔记资料.pdf CoreJava是Java编程语言的核心部分,涵盖了...通过对CoreJava全套详细笔记资料的学习,我们可以更好地理解Java语言的基础知识和高级应用,从而提高自己的编程能力和解决问题的能力。
在Java编程语言中,继承是面向对象编程的一个关键特性,它允许子类继承父类的属性和方法,从而实现代码的复用和扩展。在Java中,类的继承是单继承的,即一个子类只能有一个直接父类,但可以通过接口实现多继承的效果...
达内学习笔记(corejava) 2009.11 达内学习笔记(corejava) 2009.11 达内学习笔记(corejava) 2009.11 达内学习笔记(corejava) 2009.11 达内学习笔记(corejava) 2009.11 达内学习笔记(corejava) ...
### 达内COREJAVA学习笔记知识点详述 #### 一、Java版本与平台概述 - **J2SE**: Java Standard Edition,即Java标准版,针对桌面应用开发。 - **JAVA SE**: 指的是Java SE 5.0,发布于2004年,增加了泛型、枚举等...
### Java学习笔记及心得知识点详细解析 #### 标题:Java学习笔记及心得 #### 描述:Core Java 学习笔记及心得 pdf格式可打开。涵盖了java的基础入门知识,非常适合自学的及想深入学习理解的同学。 #### 标签:...
自己学习corejava核心技术卷一时的学习笔记和心得,提出的一些问题
这份"corejava课程笔记.rar"压缩包包含了为期17天的学习内容,全面覆盖了CoreJava的核心概念和技术,旨在为初学者提供一条清晰的学习路径。 在Java的世界里,CoreJava是指Java的基础部分,不涉及高级特性如J2EE、...