您的位置:首页 > 职场人生

黑马程序员-多线程

2012-06-27 13:59 246 查看
---------------------- android培训java培训、期待与您交流! ----------------------

一, 首先需要知道什么是进程?什么是线程?

当计算机运行一个程序时候,就会有一个相对应的进程,比如开启暴风影音后,就会有一个暴风影音的进程在运行。也就是说当运行一个应用程序的时候,就启动了一个进程,当然有些会启动多个进程。

启动进程的时候,操作系统会为进程分配资源,其中最主要的资源是内存空间,因为程序是在内存中运行的。

而在一个进程中可能有多个线程, 在进程中,有些程序流程块是可以乱序执行的,并且这个代码块可以同时被多次执行。实际上,这样的代码块就是线程体。线程是进程中乱序执行的代码流程。当多个线程同时运行的时候,这样的执行模式成为并发执行。

多线程的目的是为了最大限度的利用CPU资源。
二, 如何定义线程:
1、扩展java.lang.Thread类。
此类中有个run()方法,应该注意其用法:
public void run()

如果该线程是使用独立的
Runnable
运行对象构造的,则调用该
Runnable
对象的
run
方法;否则,该方法不执行任何操作并返回。

Thread
的子类应该重写该方法。

2、实现java.lang.Runnable接口。
void run()
使用实现接口
Runnable
的对象创建一个线程时,启动该线程将导致在独立执行的线程中调用对象的
run
方法。
方法
run
的常规协定是,它可能执行任何所需的操作。

三,实例化线程:

1、如果是扩展java.lang.Thread类的线程,则直接new即可。

2、如果是实现了java.lang.Runnable接口的类,则用Thread的构造方法:

Thread(Runnable target)

Thread(Runnable target, String name)

Thread(ThreadGroup group, Runnable target)

Thread(ThreadGroup group, Runnable target, String name)

Thread(ThreadGroup group, Runnable target, String name, long stackSize)

四,启动线程

在线程的Thread对象上调用start()方法,而不是run()或者别的方法。

在调用start()方法之前:线程处于新状态中,新状态指有一个Thread对象,但还没有一个真正的线程。在调用start()方法之后:发生了一系列复杂的事情启动新的执行线程(具有新的调用栈);

该线程从新状态转移到可运行状态; 当该线程获得机会执行时,其目标run()方法将运行。

注意:对Java来说,run()方法没有任何特别之处。像main()方法一样,它只是新线程知道调用的方法名称(和签名)。因此,在Runnable上或者Thread上调用run方法是合法的。但并不启动新的线程

五,守护线程

守护线程使用的情况较少,但并非无用,举例来说,JVM的垃圾回收、内存管理等线程都是守护线程。这里就不在写。可以再网上查找有关的例子去看。
六,线程的同步
多个线程同时访问某个资源的时候,由于多个线程的并发运行就会导致多个线程同时对一个资源进行操作,这就会导致一些问题的出现。这时候就会出现所谓的读脏数据。
线程的同步就是为了防止多个线程访问一个数据对象时,对数据造成的破坏。
为了防止读脏数据的情况,就要对公共资源的访问进行限制,每次访问只能是一个线程访问。通过限制就会避免出现读脏数据的情况。
我们可以这样做:
把竞争访问的资源类标识为private;
同步哪些修改变量的代码,使用synchronized关键字同步方法或代码。
当程序运行到非静态的synchronized同步方法上时,自动获得与正在执行代码类的当前实例(this实例)有关的锁。获得一个对象的锁也称为获取锁、锁定对象、在对象上锁定或在对象上同步。
当程序运行到synchronized同步方法或代码块时才该对象锁才起作用。
一个对象只有一个锁。所以,如果一个线程获得该锁,就没有其他线程可以获得锁,直到第一个线程释放(或返回)锁。这也意味着任何其他线程都不能进入该对象上的synchronized方法或代码块,直到该锁被释放。
释放锁是指持锁线程退出了synchronized同步方法或代码块
六,线程的通信
线程之间的通信要用到三个方法:wait(),notify(),notifyAll()。
wait方法:用来中断方法的执行,是本线程等待,暂时让出cpu的使用权。
notify()方法:通知最先进入wait池中的线程移出wait池。
notifyAll()方法:通知wait池中所有的线程移出wait池。

注意:wait(),notify(),notifyAll()都是Object类中的final方法,被所有的类继承,且不允许重写的方法。

另外还有一个方法很重要:

sleep()

如果我们想在CPU执行到当前线程的让出CPU资源,让CPU切换到别的线程,我们可以在一个线程中调用sleep方法。sleep(t)可以指定线程睡眠的时间。线程休眠的目的是使线程让出CPU的最简单的做法之一,当休眠一定时间后,线程会苏醒,进入准备状态等待执行。

---------------------- android培训java培训、期待与您交流! ----------------------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: