在讲述多线程之前有必要先弄清楚进程与线程的区别和关系。
进程就是计算机中正在执行的程序(即处于活动状态的程序),且每一个进程都有自己独立一块内存空间和一组系统资源。这些程序使用的内存空间和资源都是独立的,并且每个程序也是为了各自的任务而运行,互不干扰。
在进程的基础上提出了线程的概念,线程使得在一个进程中同时处理多个任务成为可能。线程可以看作是进程的进一步细分,也就是把进程完成的任务划分成一个个更小的子任务,每一个子任务就是一个线程,然后去执行这些细分的线程。
线程是基于进程的一个基本运行单位,线程中同样包括一个内存入口点地址、一个出口点地址及能够顺序执行的代码序列。
线程与进程的重要区别在于线程不能够单独执行,它必须运行在处于活动状态的进程中。线程是在进程作用域内活动的一系列指令流,所以线程也被称为轻型进程。
1.多线程简介
多线程机制允许在程序中“并行”执行多个指令流,每个指令流被称作一个线程,且彼此间的执行相互独立。
在单CPU计算机系统中,系统把CPU的时间片按照调度算法分配给各个线程,因此各个线程实际上是分时执行的。在多CPU计算机系统中,同一个程序的不同线程可以分配到不同的CPU上去执行,多个线程的执行是并发的。
在多线程中,各个线程的控制流彼此独立,所以多线程和传统的单线程在程序设计上最大的区别是,各个线程之间的代码是乱序执行的。因此,在进行多线程程序设计时,往往会增加一些线程状态控制的语句以使线程的运行满足程序的要求。
2.多线程机制
Java引入了虚拟处理器技术,将线程支持与语言运行环境结合在一起,不管在任何系统下,Java语言都提供了多任务并发执行的能力,对多线程的综合支持也是Java语言的一个重要特色。
在Java中,内置了Thread类来实现多线程。一个线程是由三部分组成的:
(1)虚拟处理机,封装在java.lang.Thread类中,它控制着整个线程的运行,提供对多线程的支持。
(2)执行的程序代码,传递给Thread类,由Thread类控制顺序执行。
(3)程序所处理的数据,传递给Thread类。
需要注意的是,程序代码可以根据需要被多个线程所共享,它们是和数据相互独立的,两个线程在执行同一个类的实例代码时可以共享同一段代码。同样的,数据也可以根据需要被多个线程所共享,与代码相互独立,两个线程在访问一个对象时也可以共享相同的数据。
3.线程类
在Java中,Thread类是负责向其他类提供线程支持的最主要的类。Thread类在java.lang包中定义,其构造方法有以下一些:
Thread();
Thread(Runnable target);
Thread(Runnable target, String name);
Thread(String name);
Thread(ThreadGroup group, String name);
Thread(ThreadGroup group, Runnable target);
Thread(ThreadGroup group, Runnable target, String name);
Thread(ThreadGroup group, Runnable target, String name, long stackSize);
其中,参数group指明该线程所属的线程组;参数target是指实际执行线程体的目标对象,必须实现Runnable接口;参数name为线程名;参数stackSize为指定的堆栈大小。
除此之外,Thread类的常用方法有以下一些:
(1)public static void yield(); //暂停当前执行的线程,允许其他线程执行
(2)public static void sleep(long millis); //使当前执行的线程睡眠指定的时间
(3)public void start(); //使线程由新建状态变成可运行状态
(4)public void run(); //运行线程
(5)public final void stop(); //停止当前线程
(6)public final void wait(); //导致当前的线程等待,直到被唤醒或超过指定的等待时间
(7)public final boolean isAlive(); //判断线程是否处于活动状态
(8)public final void setPriority(int new); //设置线程的优先级
(9)public static Thread currenthread(); //返回当前执行线程对象的引用
(10)public final void notify(); //唤醒一个等待中的线程
(11)public final void notifyAll(); //唤醒所有处于等待中线程
(待续......)