黑马程序员学习笔记七——多线程

来源:互联网 发布:电脑怎么使用手机网络 编辑:程序博客网 时间:2024/06/10 08:49

----------------------android培训java培训、期待与您交流! ----------------------



多线程

1.初识线程

进程和线程区别

进程是一个正在执行的程序,每一个进程执行都有一个执行顺序。该顺序是一个执 行路径,或者称之为一个控制单元。

线程就是进程中一个独立的控制单元。线程控制进程的执行。

所以一个进程中至少有一个线程。

Java中的主线程:.jvm启动时会有一个进程javaexe 该进程至少有一个线程负责java程序的运行。而且这个线程运行的代码存在于main方法中,那么这个线程称之为主线程。

*更多细节说明jvm启动的不止一个线程。例如还有负责垃圾回收机制的线程。

当前线程:这个是容易混淆的概念。一般指通过Thread.currentThread()来获取的进程。

后台线程:指为其他线程提供服务的线程,也称为守护线程。JVM的垃圾回收线程就是一个后台线程。

前台线程:是指接受后台线程服务的线程,其实前台后台线程是联系在一起,就像傀儡和幕后操纵者一样的关系。傀儡是前台线程、幕后操纵者是后台线程。由前台线程创建的线程默认也是前台线程。可以通过isDaemon()setDaemon()方法来判断和设置一个线程是否为后台线程。

2.Java与多线程

Java语言的多线程需要操作系统的支持。

Java 虚拟机允许应用程序并发地运行多个执行线程。Java语言提供了多线程编程的扩展点,并给出了功能强大的线程控制API。在Java中,多线程的实现有两种方式:

扩展java.lang.Thread

实现java.lang.Runnable接口

即将类声明为Thread子类,该子类应重写Thread类的Run方法。另一种是声明实现Runable接口的类,该类应实现run方法。

例:

public class Test extends Thread{    //该类继承thread

Test(String name){

super(name);

}

public void run(){            //重写thread子类run 方法。

for(int x=0;x<60;x++){

System.out.println(this.getName()+"**"+x);

}

}

}

public class Consumer implements Runnable{  //实现Runable 接口。

private Resource res;

Consumer(Resource res){

this.res=res;

}

public void run(){                    //复写Runable 接口子类run方法。

res.out();

}

}

在这里。Threa 类用于描述线程,该线程就定义了一个功能用于存储要运行的代码。这个功能就是run 方法。

*几个常见操作:static Thhread.CurrentThread();获取当前对象。

getname()获取线程名称。

setname();设置线程名称。

*注意:Threadsuspend()resume()两个方法在JDK1.5中已经过时,不再介绍。因为有死锁倾向。

3.实现和继承的区别:

建议实现方式避免了单继承的局限性,在定义线程建议使用实现方式。

区别:继承Thread 编程代码存放在Thread子类run方法中。

实现Runnable 编程代码存在接口的子类run 方法中。

4.多线程运行出现的安全问题。

原因:当多余语句在操作同一线程共享数据时,一个线程多条语句只执行了一部分,还没有执行完。另一个线程参与进来执行。导致共享数据错误。

解决方案:对多条语句共享数据的语句只能让没有时间段让一个线程都执行完。在执行过程中,其他线程不可以参与执行。

Java对于线程安全问题也提供了一个专业解决工具。就是同步代码块。

Synchronized(对象){需要被同步的代码}

**同步前提:

  (a)必须有两个或者两个以上线程需要同步

      (b)必须是多个线程使用 同一个锁才能同步

      (c)必须保证同步中有一个线程在运行。

5.线程状态

a、新建状态(New):新创建了一个线程对象。

b、就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法。该状态的线程位于可运行线程池中,变得可运行,等待获取CPU的使用权。

c、运行状态(Running):就绪状态的线程获取了CPU,执行程序代码。

d、阻塞状态(Blocked):阻塞状态是线程因为某种原因放弃CPU使用权,暂时停止运行。直到线程被notify(),或者notifyAll()进入就绪状态,才有机会转到运行状态。阻塞的情况分三种:

    (1)、等待阻塞:运行的线程执行wait()方法,JVM会把该线程放入等待池中。

2)、同步阻塞:运行的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则JVM会把该线程放入锁池中。

3)、其他阻塞:运行的线程执行sleep()join()方法,或者发出了I/O请求时,JVM会把该线程置为阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态。

d、死亡状态(Dead):线程执行完了或者因异常退出了run()方法,该线程结束生命周期。

----------------------android培训java培训、期待与您交流! ----------------------

详细请查看:http://edu.csdn.net/heima

原创粉丝点击