线程的施用

线程的使用
一、基本概念
    我们接触到一些名词,程序、进程以及现在谈论的线程,这三者指的是什么,区别又是什么?以下做一个简单的介绍。

    程序是指令的集合,一般存储在磁盘的文件上;线程相当于程序内部一个独立的运行单位,线程在程序中是独立的,并发的执行流,当一个程序进入内存运行即变成一个进程,进程处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调用的独立单位,进程切换开销大。所有的操作系统都支持同时运行多个任务,一个任务通常就是一个程序,每个程序运行中就是一个进程,当一个程序运行时,内部可能包含了多个线程。

    对于一个CPU而言,它在某个时间点上只能执行一个程序,就是说只能运行一个进程。CPU不断在这些进程之间轮回切换,CPU的执行速度很快,我们感觉不到,所以CPU在多个进程之间轮回执行,但我们感觉好像多个进程同时执行。
  
    每个java程序中至少都有一个线程——主线程,其他线程的运行都要通过主线程触发,主线程可以控制其他线程,其他线程结束,主线程结束。


二、线程与进程的区别
    1.一个应用程序就是一个进程,而线程是一个进程内部的多个运行单位。
    2.同一个进程中的多个线程将共享同一个进程的虚拟空间,也就是共享一块内存空间和一组系统资源,利用这些共享的数据,线程很容易实现相互之间的通信。线程在程序内部还可以互相调用,因此线程比进程有更高的性能。
    3.当操作系统创建一个进程时,该进程必须分配独立的内存空间,分配大量相关资料,但创建一个线程简单的多,因此线程切换的负担比进程切换的负担小。


三、为什么要使用多线程呢?

1,进程之间不能共享内存,但线程之间共享内存非常容易。
2,系统创建进程需要为该进程重新分配系统资源,但创建线程代价要小的多,因此使用多线程来实现多个任务并发比多进程要效率高。
3,Java语言中内置多线程功能的支持,从而简化了Java的并发编程(停止现在正在执行的事情去执行另外一件),没有多线程功能时,并发编程对电脑硬件要求较高。


四、如何建立线程
    (1)继承Thread类创建和启动线程
     1,定义Thread类的子类,并重写该类的run方法,该run方法的方法体就是代表了线程需要完成的任务,run方法也被称为线程执行体。
     2,创建Thread类子类的实例,即创建了线程的对象。
     3,用线程对象的start方法来启动该线程。
    (2)实现Runnable接口创建和启动线程
     1,实现Runable接口的实现类,并重写该接口的run方法,该run方法的方法体同样是该线程的执行体。
     2,创建Runable实现类的实例,并以此实例作为Thread类的目标来创建Thread类的目标创建Thread对象,该Thread对象才是真正的线程对象。
     注:Thread类是Runable接口的实现类,Runnable接口中只有run()方法,Thread中除了run()方法外还有其他方法 。Thread类还有一个静态方法sleep(long time),在线程运行时,调用这个方法,可以让线程暂停time指定的时间,使CPU的利用率得到提高。

    如何知道线程已经结束?
    需要使用 isAlive() 测试线程是否处于活动状态。当线程处于就绪,运行,阻塞三种状态时,该方法返回true,当该线程处于创建,死亡两种状态时,该方法返回false。
    join()方法的使用是使被join的线程终止。