多线程

一、多线程编程基础

1、同一个应用程序需要并行处理多件任务,是在一个进程中建立多个线程。创建线程比创建进程开销要小得多,线程之间的协作和数据交换也比较容易。一个应用程序的一次执行对应于一个进程,每个进程中至少有一个线程在执行其地址空间中的代码。在单线程程序中,一个进程中只有一个线程,代码按调用顺序依次执行。如果要实现一个程序之中多段代码同时并发执行,就需要产生多个线程,并指定每个线程上所要运行的程序段,这就是多线程。在Java程序中创建多线程有两种方法:继承Thread类和实现Runnable接口。

2、Thread类,Java的Thread类封装了Java程序中的一个线程(对象)需要拥有的属性和方法。从Thread类派生一个子类,并创建这个子类的对象,就可以产生一个新的线程。这个子类应该重写Thread类的run方法,在run方法中写入需要在新线程中执行的语句段。这个子类的对象需要调用start方法来启动,新线程将自动进入run方法。原线程将同时继续往下执行。Thread类直接继承了Object类,并实现了Runnable接口。Thread类位于java.lang包中,因而程序开头不用import任何包就可直接使用。

3、后台线程(也叫守护线程)通常是为了辅助其他线程而运行的线程,它不妨碍程序终止。一个进程中只要还有一个前台线程在运行,这个进程就不会结束。如果一个进程中所有前台线程都已经结束,那么无论是否还有未结束的后台线程,这个进程都会结束。“垃圾回收”便是一个后台线程。如果对某个线程对象在启动(调用start方法)之前调用了setDaemon(true)方法,这个线程就变成了后台线程。

二、线程的生命周期

线程的几种基本状态,一个线程在任何时刻都处于某种线程状态(thread state)。

①线程启动并进入就绪状态一个新线程的生命从新建一个线程类对象开始,此时线程只是一个空的线程对象,并没有为其分配系统资源。当线程处于这个状态时,只可以对其进行start操作。执行了start方法后,系统才为新线程创建资源,并自动调用其run函数,线程将处于等待CPU资源的就绪状态。②运行状态:对于单CPU的系统,不可能同时运行所有线程,Java虚拟机(JRM)实现了一个调度方案使各个处于就绪状态的线程分时占用CPU。获得了CPU资源的线程就能进入运行状态。③死亡状态:在线程的run方法结束时,处于运行状态的线程就进入了死亡状态。在线程处于死亡状态并且没有该线程对象的引用时,垃圾收集器能够从内存中删除该线程对象。④阻塞状态:处于执行状态的线程由于需要等待某种资源或条件而不得不暂停运行,进入阻塞状态。

三、线程的优先级

每个Java线程都有一个优先级,其范围都在Thread.MIN_PRIORITY(常数1)和Thread.MAX_PRIORITY(常数10)之间。默认情况下,每个线程的优先级都设置为Thread.NORM_PRIORITY(常数5)。具有较高优先级的线程比优先级较低的线程优先执行。假设某线程正在运行,则只有出现下列情况之一,才会使其暂停运行:①一个具有更高优先级的线程变为就绪状态(Ready);②由于输入输出(或其他一些原因),调用sleep、wait、yield方法使其发生阻塞;③对于支持时间分片的系统,时间片的时间期满。

48c7a7efce1b9d16eed691e8f3deb48f8c546422.jpg

标签:

发表评论: