黑马程序员:Java多线程
2012-08-10 11:52
204 查看
----------
android培训、java培训、期待与您交流! ----------
进程:是一个正在执行中的程序。每一个进程执行都有一个执行顺序。
该顺序是一个执行路径,或者叫一个控制单元。
线程:就是进程中的一个独立的控制单元。线程在控制着进程的执行。一个进程中至少有一个线程。
1,定义类继承Thread。
2,复写Thread类中的run方法。
目的:将自定义代码存储在run方法。让线程运行。
3,调用线程的start方法,
该方法两个作用:启动线程,调用run方法。
1,定义类实现Runnable接口
2,覆盖Runnable接口中的run方法。
将线程要运行的代码存放在该run方法中。
3,通过Thread类建立线程对象。
4,将Runnable接口的子类对象作为实际参数传递给Thread类的构造函数。
为什么要将Runnable接口的子类对象传递给Thread的构造函数。
因为,自定义的run方法所属的对象是Runnable接口的子类对象。
所以要让线程去指定指定对象的run方法。就必须明确该run方法所属对象。
5,调用Thread类的start方法开启线程并调用Runnable接口子类的run方法。
所以创建线程建议使用实现Runnable方式
两种方式区别:
继承Thread:线程代码存放Thread子类run方法中。
实现Runnable,线程代码存在接口的子类的run方法。
1,初始状态,线程创建,线程对象调用start()方法。
2,可运行状态,也就是等待Cpu资源,等待运行的状态。
3,运行状态,获得了cpu资源,正在运行状态。
4,阻塞状态,也就是让出cpu资源,进入一种等待状态,而且不是可运行状态,有三种情况会进入阻塞状态。
1)如等待输入(输入设备进行处理,而CPU不处理),则放入阻塞,直到输入完毕,阻塞结束后会进入可运行状态。
2)线程休眠,线程对象调用sleep()方法,阻塞结束后会进入可运行状态。
3)线程对象2调用线程对象1的join()方法,那么线程对象2进入阻塞状态,直到线程对象1中止。
5,中止状态,也就是执行结束。
6,锁池状态
7,等待队列
(7状态的图)
![](http://my.csdn.net/uploads/201208/10/1344591712_5127.jpg)
(5状态的图)
![](http://my.csdn.net/uploads/201208/10/1344592548_7509.png)
1.同步代码块synchronized(obj)中的锁是obj锁(obj可以使任意对象)
2.同步函数中的锁是this锁
3.静态同步函数中的锁是Class对象(类名.class)
wait()等待的线程都存在于内存线程池中。
notify()唤醒线程池中的线程,一般是唤醒最先等待的线程。
notifyAll()唤醒全部
以上三个全部用在同步中,使用必须要有该对象的监视器(锁),默认是this
2.停止线程
stop()方法已经过时
当线程处于冻结状态时,要把他停止的话,就必须把他唤醒,判断执行条件,最终结束线程。
Thread类提供了该方法interrupt,就是强制让线程恢复到运行状态中来
3.守护线程
setDaemon(boolean on)
当on为true时,该线程则为守护线程
当正在运行的线程都是守护线程时,Java 虚拟机退出。
4.join方法
当A线程执行到了B线程的.join()方法时,A就会等待。等B线程都执行完,A才会执行
join可以用来临时加入线程执行
5.优先级
优先级总共有10级(1-10)
setPriority(int newPriority)设置线程的优先级
getPriority()得到线程优先级
优先级的一些常量:
MAX_PRIORITY:最高优先级-->10级
MIN_PRIORITY:最低优先级-->1级
NORM_PRIORITY:默认优先级-->5级(大多数未定义优先级的线程的优先级都为5级)
优先级越大,则获取cpu资源的概率越大
6.yield方法
暂停当前正在执行的线程对象,并执行其他线程
java中解决死锁是用synchronized关键字进行修饰,也就是用同步去解决死锁
实现同步是用synchronized方法和synchronized代码块
死锁产生的原因:
在上面那代码中存在着两个锁locka和lockb,和两个线程t1,t2,当t1拿到locka锁,申请lockb锁,但是此时t2已经拿到lockb锁,而它也在申请locka锁,这时候他们分别都拿着对方锁要的锁不放,这样就就会一直僵持下去,就这样一直消耗着系统资源。
所以我们以后写代码的时候一定要避免死锁。
----------
android培训、java培训、期待与您交流! ----------
详情请查看:http://edu.csdn.net/heima/
android培训、java培训、期待与您交流! ----------
进程:是一个正在执行中的程序。每一个进程执行都有一个执行顺序。
该顺序是一个执行路径,或者叫一个控制单元。
线程:就是进程中的一个独立的控制单元。线程在控制着进程的执行。一个进程中至少有一个线程。
创建线程的2种方式:
1.继承Thread类
实现步骤:1,定义类继承Thread。
2,复写Thread类中的run方法。
目的:将自定义代码存储在run方法。让线程运行。
3,调用线程的start方法,
该方法两个作用:启动线程,调用run方法。
2.实现Runnable接口
步骤:1,定义类实现Runnable接口
2,覆盖Runnable接口中的run方法。
将线程要运行的代码存放在该run方法中。
3,通过Thread类建立线程对象。
4,将Runnable接口的子类对象作为实际参数传递给Thread类的构造函数。
为什么要将Runnable接口的子类对象传递给Thread的构造函数。
因为,自定义的run方法所属的对象是Runnable接口的子类对象。
所以要让线程去指定指定对象的run方法。就必须明确该run方法所属对象。
5,调用Thread类的start方法开启线程并调用Runnable接口子类的run方法。
3.实现Runnable方式和继承Thread方式有什么区别呢?
实现Runnable方式好处:避免了单继承的局限性。所以创建线程建议使用实现Runnable方式
两种方式区别:
继承Thread:线程代码存放Thread子类run方法中。
实现Runnable,线程代码存在接口的子类的run方法。
线程的7种状态:
有的书上也只有认为前五种状态:而将“锁池”和“等待池”都看成是“阻塞”状态的特殊情况:这种认识也是正确的,但是将“锁池”和“等待池”单独分离出来有利于对程序的理解1,初始状态,线程创建,线程对象调用start()方法。
2,可运行状态,也就是等待Cpu资源,等待运行的状态。
3,运行状态,获得了cpu资源,正在运行状态。
4,阻塞状态,也就是让出cpu资源,进入一种等待状态,而且不是可运行状态,有三种情况会进入阻塞状态。
1)如等待输入(输入设备进行处理,而CPU不处理),则放入阻塞,直到输入完毕,阻塞结束后会进入可运行状态。
2)线程休眠,线程对象调用sleep()方法,阻塞结束后会进入可运行状态。
3)线程对象2调用线程对象1的join()方法,那么线程对象2进入阻塞状态,直到线程对象1中止。
5,中止状态,也就是执行结束。
6,锁池状态
7,等待队列
(7状态的图)
![](http://my.csdn.net/uploads/201208/10/1344591712_5127.jpg)
(5状态的图)
![](http://my.csdn.net/uploads/201208/10/1344592548_7509.png)
线程中存在的一些锁:
java线程中默认的锁是this锁1.同步代码块synchronized(obj)中的锁是obj锁(obj可以使任意对象)
2.同步函数中的锁是this锁
3.静态同步函数中的锁是Class对象(类名.class)
线程中的一些方法及与其相关的方法:
1.wait()、notify()、notifyAll()wait()等待的线程都存在于内存线程池中。
notify()唤醒线程池中的线程,一般是唤醒最先等待的线程。
notifyAll()唤醒全部
以上三个全部用在同步中,使用必须要有该对象的监视器(锁),默认是this
2.停止线程
stop()方法已经过时
当线程处于冻结状态时,要把他停止的话,就必须把他唤醒,判断执行条件,最终结束线程。
Thread类提供了该方法interrupt,就是强制让线程恢复到运行状态中来
3.守护线程
setDaemon(boolean on)
当on为true时,该线程则为守护线程
当正在运行的线程都是守护线程时,Java 虚拟机退出。
4.join方法
当A线程执行到了B线程的.join()方法时,A就会等待。等B线程都执行完,A才会执行
join可以用来临时加入线程执行
5.优先级
优先级总共有10级(1-10)
setPriority(int newPriority)设置线程的优先级
getPriority()得到线程优先级
优先级的一些常量:
MAX_PRIORITY:最高优先级-->10级
MIN_PRIORITY:最低优先级-->1级
NORM_PRIORITY:默认优先级-->5级(大多数未定义优先级的线程的优先级都为5级)
优先级越大,则获取cpu资源的概率越大
6.yield方法
暂停当前正在执行的线程对象,并执行其他线程
线程中的死锁问题:
线程中最大的问题就是会在同步的过程中产生死锁,而产生死锁了就会无限的无效的消耗系统资源,所以在线程中应该尽量避免死锁java中解决死锁是用synchronized关键字进行修饰,也就是用同步去解决死锁
实现同步是用synchronized方法和synchronized代码块
死锁产生的原因:
public class DeadLockDemo { public static void main(String[] args) { Thread t1 = new Thread(new Test(true)); Thread t2 = new Thread(new Test(false)); t1.start(); t2.start(); } } class MyLock { static Object locka = new Object(); static Object lockb = new Object(); } class Test implements Runnable { private boolean flag; Test(boolean flag) { this.flag = flag; } public void run() { if(flag) { while(true) { synchronized(MyLock.locka) { System.out.println(Thread.currentThread().getName()+"...if locka "); synchronized(MyLock.lockb) { System.out.println(Thread.currentThread().getName()+"..if lockb"); } } } } else { while(true) { synchronized(MyLock.lockb) { System.out.println(Thread.currentThread().getName()+"..else lockb"); synchronized(MyLock.locka) { System.out.println(Thread.currentThread().getName()+".....else locka"); } } } } } }
在上面那代码中存在着两个锁locka和lockb,和两个线程t1,t2,当t1拿到locka锁,申请lockb锁,但是此时t2已经拿到lockb锁,而它也在申请locka锁,这时候他们分别都拿着对方锁要的锁不放,这样就就会一直僵持下去,就这样一直消耗着系统资源。
所以我们以后写代码的时候一定要避免死锁。
----------
android培训、java培训、期待与您交流! ----------
详情请查看:http://edu.csdn.net/heima/
相关文章推荐
- 黑马程序员——Java语言基础——04.多线程(1)多线程概念
- 黑马程序员 Java基础 多线程
- 黑马程序员——java学习之多线程处理
- 黑马程序员:java学习要点-多线程(下)
- 黑马程序员---java基础多线程
- 黑马程序员_王康 java多线程
- 黑马程序员-----JAVA多线程
- 黑马程序员--java基础复习之多线程及线程间通信
- 黑马程序员——Java基础—多线程(一)
- 黑马程序员--Java基础--多线程创建及单例模式
- 黑马程序员---Java基础---多线程
- 黑马程序员----java面向对象05(多线程)
- 黑马程序员--Java基础之多线程(1)
- 黑马程序员——java基础之多线程
- 黑马程序员-----java多线程(学习日记)
- 黑马程序员--Java面向对象——多线程——下
- 黑马程序员——Java 基础:多线程
- 黑马程序员_java多线程的同步和死锁
- 黑马程序员:Java基础——多线程的概念与创建
- 黑马程序员——Java基础--多线程(一)