黑马程序员-多线程

---------------------- 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培训、期待与您交流! ----------------------

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值