黑马程序员_多线程
2012-11-05 18:06
232 查看
----------------------android培训、java培训、期待与您交流!
----------------------
实现Runnable接口来创建并启动多线程的步骤:1.定义Runnable接口的实现类,并重写该接口的run方法,该run方法的方法体同样是该线程的线程执行体。2.创建Runnable实现类的实例,并以此实例作为Thread的参数来创建Thread对象,该Thread对象才是真正的线程对象。启动线程使用start方法,而不是run方法。调用start方法来启动线程,系统会把该run方法当成线程执行体来处理,调用run方法则run方法会立即被执行,就是只是把run方法当成一个普通的方法执行。
线程的运行和阻塞状态
后台线程:有一种线程,它是在后台运行的,它的任务就是为其他线程提供服务,这种线程称为后台线程,又称为守护线程。后台线程有一个特征就是如果所有的前台线程都死亡,后台线程会自动死亡。调用Thread对象的setDaemon(ture)方法可以将指定线程设置成后台线程。
线程睡眠:sleep;线程让步:yield;改变优先级
如果我们需要让当前正在执行的线程暂停一段时间,并进入阻塞状态,则可以通过调用Thread类的静态方法sleep方法。yield()方法是一个和sleep方法有着相似的方法,它也可以让当前正在执行的线程暂停,但它不会阻塞该线程,它只是将线程转入就绪状态。每个程序执行都具有一定的优先级,Thread提供了setPriority(int newPriority)和getPriority()方法来设置和返回指定线程的优先级。
同步代码块:synchronized(obj){ .....//此处的代码就是同步代码块 } 该语法格式中的synchronized后括号里的obj就是同步监视器,该代码的含义是:线程开始执行同步代码块之前,必须先获得对同步监视器的锁定。任何时刻只能有一条线程可以获得对同步监视器的锁定,当同步代码块执行结束之后,该线程自动释放了对该同步监视器的锁定。同步函数与同步代码块是对应的,同步方法就是使用synchronized关键字来修饰某个方法,则该方法称为同步方法。对于同步方法无需指定同步监视器,同步方法的同步监视器就是this,也就是该对象本身。当线程的同步方法执行完就会释放同步监视器,在方法中遇到break,return终止代码,出现未处理的Error,Exception,执行了监视器对象的wait()方法则会释放同步监视器。
同步锁Lock,这是从java 1.5之后提供的另一种线程同步机制:它通过显式定义同步锁对象来实现同步,在这种机制下,同步锁应该使用Lock对象充当。通常认为:Lock提供了比synchronized方法和代码块更广泛的锁定操作,Lock实现允许更灵活的结构,可以具有差别很大的属性,并且可以支持多个相关的Condition对象。Lock代码格式:
----------------------
android培训、java培训、期待与您交流! ----------------------
详细请查看:http://edu.csdn.net/heima
----------------------
线程和进程:
当一个程序进入内存运行,即变成一个进程。进程是处于运行过程中的程序,并且具有一定独立功能,进程是系统进行资源分配和调度的一个独立单位。一般而言,进程包含独立性,动态性和并发性。并行性是指同一时刻,有多条指令在多个处理器上同时执行;并发性是指同一时刻只能有一条指令执行,但多个进程指令被快速的轮换执行,使得在宏观上具有多个进程同时执行的效果。线程也被称作轻量级进程,线程是进程的执行单元。线程是进程的组成部分,一个进程可以拥有多个线程,一个线程必须有一个父进程。线程是共享父进程中的共享变量及部分环境,相互之间协同来完成进程所要完成的任务。
线程的创建和启动:
java使用Thread类代表线程,所有的线程对象都必须是Thread类或其子类的实例。每条线程的作用是完成一定的任务,实际上是执行一段顺序执行代码,java使用run方法来封装一段顺序执行代码。创建线程的方法有两种:一种是继承Thread类创建线程类;另一种是实现Runnable接口创建线程类。
通过继承Thread类来创建并启动多线程的步骤:1.定义Thread类的子类,并重写该类的run方法,该run方法的方法体就是代表了线程需要完成的任务,因此,我们经常把run方法称为线程执行体。2.创建Thread子类的实例,及创建了线程对象。3.用线程对象的start方法来启动线程。实现Runnable接口来创建并启动多线程的步骤:1.定义Runnable接口的实现类,并重写该接口的run方法,该run方法的方法体同样是该线程的线程执行体。2.创建Runnable实现类的实例,并以此实例作为Thread的参数来创建Thread对象,该Thread对象才是真正的线程对象。启动线程使用start方法,而不是run方法。调用start方法来启动线程,系统会把该run方法当成线程执行体来处理,调用run方法则run方法会立即被执行,就是只是把run方法当成一个普通的方法执行。
线程的运行和阻塞状态
控制线程:
join线程:java 提供了让线程等待另一个线程完成的方法join()方法。当某个程序执行流中调用其他线程的join方法时,调用线程将被阻塞,直到join方法加入的join线程完成为止。后台线程:有一种线程,它是在后台运行的,它的任务就是为其他线程提供服务,这种线程称为后台线程,又称为守护线程。后台线程有一个特征就是如果所有的前台线程都死亡,后台线程会自动死亡。调用Thread对象的setDaemon(ture)方法可以将指定线程设置成后台线程。
线程睡眠:sleep;线程让步:yield;改变优先级
如果我们需要让当前正在执行的线程暂停一段时间,并进入阻塞状态,则可以通过调用Thread类的静态方法sleep方法。yield()方法是一个和sleep方法有着相似的方法,它也可以让当前正在执行的线程暂停,但它不会阻塞该线程,它只是将线程转入就绪状态。每个程序执行都具有一定的优先级,Thread提供了setPriority(int newPriority)和getPriority()方法来设置和返回指定线程的优先级。
线程的同步及线程安全
当多个线程共享同一个数据时容易产生安全问题,比如银行取钱的问题,账户上面有1000元,两个线程去取,各取800,最后结果账户成了-600,这不是银行希望的结果。解决线程安全问题可以使用同步代码块,同步函数,或Lock锁。同步代码块:synchronized(obj){ .....//此处的代码就是同步代码块 } 该语法格式中的synchronized后括号里的obj就是同步监视器,该代码的含义是:线程开始执行同步代码块之前,必须先获得对同步监视器的锁定。任何时刻只能有一条线程可以获得对同步监视器的锁定,当同步代码块执行结束之后,该线程自动释放了对该同步监视器的锁定。同步函数与同步代码块是对应的,同步方法就是使用synchronized关键字来修饰某个方法,则该方法称为同步方法。对于同步方法无需指定同步监视器,同步方法的同步监视器就是this,也就是该对象本身。当线程的同步方法执行完就会释放同步监视器,在方法中遇到break,return终止代码,出现未处理的Error,Exception,执行了监视器对象的wait()方法则会释放同步监视器。
同步锁Lock,这是从java 1.5之后提供的另一种线程同步机制:它通过显式定义同步锁对象来实现同步,在这种机制下,同步锁应该使用Lock对象充当。通常认为:Lock提供了比synchronized方法和代码块更广泛的锁定操作,Lock实现允许更灵活的结构,可以具有差别很大的属性,并且可以支持多个相关的Condition对象。Lock代码格式:
class X { //定义锁对象 private final Lock lock = new Lock(); //定义需要保证线程安全的代码 public void m() { lock.lock(); //加锁 try {..... //需保证线程安全的代码} //使用finally块来释放锁 finally{ lock.unlock(); } } }
死锁
当两个线程相互等待对方释放同步监视器时就会发生死锁,java虚拟机没有监测,也没有采用措施来处理死锁情况,所以多线程编程时应该采取措施避免死锁的出现。一旦出现死锁,整个程序既不会发生任何异常,也不会给出任何提示,只是所有线程处于阻塞状态,无法继续。写出一个死锁程序:
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) //在locka中需要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) ////在lockb中需要locka锁 { System.out.println(Thread.currentThread().getName()+".....else locka"); } } } } } } class MyLock { static Object locka = new Object(); static Object lockb = new Object(); } class DeadLockTest { public static void main(String[] args) { Thread t1 = new Thread(new Test(true)); Thread t2 = new Thread(new Test(false)); t1.start(); t2.start(); } }
----------------------
android培训、java培训、期待与您交流! ----------------------
详细请查看:http://edu.csdn.net/heima
相关文章推荐
- 黑马程序员--视频随笔记录--多线程1
- 黑马程序员---多线程视频之经验浅谈
- 黑马程序员--Java 多线程与并发总结
- 黑马程序员--JAVA基础复习之多线程(二)线程安全与解决方法
- 黑马程序员---Java基础--11天(多线程)
- 黑马程序员——java 多线程复习笔记
- 黑马程序员——多线程
- 黑马程序员——多线程
- 黑马程序员——【Java基础】——多线程
- 黑马程序员_多线程
- 黑马程序员——Java语言基础:多线程
- 黑马程序员---多线程【java】
- 黑马程序员——Java基础---多线程
- 黑马程序员——java第十一、十二天:多线程(创建线程1-2、多线程同步代码、实现Runnable接口、安全死锁)
- 黑马程序员——多线程之线程安全的实现详解
- 黑马程序员-学习日记(多线程安全问题和死锁认识)
- 黑马程序员——多线程
- 黑马程序员JAVA基础-多线程
- 黑马程序员学习日记----多线程(二)
- 黑马程序员------多线程(No.3)(停止线程、守护线程、Join方法、优先级&yield方法、总结)