JAVA的线程

JAVA的线程

一、程序与进程:

    一个应用程序可能有多个进程,如:打开多个记事本程序将存在多个进程,但程序只有一个记事本程序,程序是代码与指令的集合,无论打开多少个记事本都将使用同一段记事本程序代码,进程可以认为是线程的集合体,操作系统为每个进程在内存中分配一个独立的地址单元。因此一个应用程序如果被多次打开,则这个应用程序的代码可能会被多次加载到内存中不同的地址单元中从而耗用大量内存,之所以说是可能会被加载是因为有些应用程序不允许被多次打开,这种应用程自身携带了一个称之为内存校验器的东西,内存校验器会在该程序被打开时首先会检查内存中是否已经加载该程序的源代码,如果在内存的某个序列单元中已经存在相同的该程序源代码则会自动调度已经存在的源代码。

二、进程与线程:

  一个进程可以为单线程也可以拥有多个线程,如:JAVA程序的进程至少有两个线程:main主线程与垃圾回收线程,这两个线程都由JAVA虚拟机调度,而如果有其它的线程则必须在主线程main线程中生成,这样的线程称为main线程的子线程。在一个进程中的所有线程共享同一段内存地址单元,由进程实现统一管理。进程之间的切换需要交换内存地址单元,而线程通过共享地址单元完成线程切换,共享同一段地址单元的各个线程是通过各自的句柄号进行区分的,一个句柄号对应一段内存的引用。

三、创建线程:

  1.继承(扩展)Thread类并重写其中的public void run()方法(通过这种方式创建的线程可以直接调用start()启动线程。

  2.用实现Runnable接口的对象作为Thread类的构造参数来构建线程。

四、线程的基本控制:

   JAVA.Lang.Thread类中提供了对线程的基本操作:

Start():启动一个线程对象使之处于就绪

Stop():结束一个线程对象使之强制或自然死亡

Sleep():休眠一个线程对象使之处于时间阻塞

Wait():等待一个线程对象使之处于挂起阻塞

Join():启动join的调用者线程对象并让当前线程使之处于suspend()阻塞直到join调用者线程结束为止

Yield():暂停一个线程对象使之让出CPU处于就绪(如果就绪队列中没有与它相同优先级的线程,则此操作不做任何工作,也不起任何作用)

Interrupt():终止一个线程对象使之强制死亡(可以终止任何状态下的线程对象)并抛出InterruptedException异常。

Notify()/NotifyAll():唤醒挂起队列中的第一个或所有线程对象使之处于就绪。

五、调度线程:

   JAVA虚拟机有一个线程调度器,该调度器决定哪个线程应该执行,哪些线程还不能执行,CPU在同一时间只能操作一个线程,不能完成两个线程的同步操作(如果有两个CPU则可以完成真正意义上的同步操作),因此每个线程的执行必须按一定的规则来进行,这个问题在不同的操作平台上有不同的表现,其主要体现在线程的优先级和线程的调度上,线程的调度有两种方式:时间片式和抢占式。时间片式说明了应用程序或操作系统为每个线程分配了一个CPU的等待周期,周期一经结束则让该线程进入准备运行状态(就绪状态),这样可以确保一个线程不会一直独占CPU资源。而抢占式意味可能有多个线程处于准备运行状态(就绪状态),但在一个独立的CPU中只有一个线程在真正运行,一个线程获得CPU执行权之后将一直执行下去直到它运行结束(stop,自然消亡)或因为某种原因阻塞(sleepwaitI/O)再或者有另一个高优先级线程完成就绪为止。线程的优先级规则:

1、  优先级高的线程先执行,优先级低的线程后执行

2、  同等优先级线程按先进先出的原则进行(慎重考虑)

3、  多线程系统会为每一个线程分配一个默认的优先级并且子类的优先级默认情况下也是继承父类的优先级。

4、  任务紧急的线程其优先级较高,这句话很模糊,正是这个模糊道出了前三条规律的慎用性。

一个线程的优先级在JAVA中被默认分配为5级,也可以通过线程对象调用setPriority()来进行设置线程的优先级,线程的优先级最高位10,最低位为1.

六、同步与互斥:

  为保证线程间的同步通信必须为线程对象所共享的资源加上对象互斥锁(又称为监视器),有两种方法可以实现对象互斥锁功能:

1、  用关键字volatile来声明一个共享数据

2、  用关键字syschronized来声明一段共享数据或代码。

Syschronized表示在同一时间段只有一个线程能够访问该段代码

  互斥是两个线程对象分别抢占对方的资源时发生的一种死锁问题,因为抢占资源的两个线程对象双方都没有交出对共享资源的CPU控制权,所以将发生线程对象间的异步争持从而导致程序无法执行下去。

 

http://blog.sina.com.cn/s/blog_5f044a740100diaa.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值