Java创建线程的两种方法

进程,线程:

几乎每种操作系统都支持进程——进程就是在某种程度上相互隔离的、独立运行的程序。进程的引入大大提高了任务并发执行的效率,但是,进程也因为耗费资源太大等缺陷限制了它在并行处理方面的发展。不过线程的引入改变了这一状况,线程也称做轻量级进程。就像进程一样,线程在程序中是独立的、并发的执行路径,每个线程有它 自己的堆栈、自己的程序计数器和自己的局部变量。但是,与独立的进程相比,进程中的线程之间的独立程度要小。它们共享内存、文件句柄和其他每个进程应有的状态。

线程的出现也并不是为了取代进程,而是对进程的功能作了扩展。进程可以支持多个线程,它们看似同时执行,但相互之间并不同步。一个进程中的多个线程共享相同的内存地址空间,这就意味着它们可以访问相同的变量和对象,而且它们从同一堆中分配对象。尽管这让线程之间共享信息变得更容易,但你必须小心,确 保它们不会妨碍同一进程里的其他线程。

目前,大多数的操作系统都支持线程,包括 Linux、Solaris 和 Windows NT/2003,都可以利用多个处理器调度线程在任何可用的处理器上执行。如果某个程序有多个活动线程,那么还可以同时调度多个线程。在精心设计的程序中,使用多个线程可以提高程序吞吐量和性能。在某些情况下,使用线程还可以使程序编写和维护起来更简单。虽然线程可以大大简化许多类型的应用程序,但是过 度使用线程可能会危及程序的性能及其可维护性。不要忘记,线程同样也在消耗资源。因此,在不降低性能的情况下,创建一定数量的线程才是真正有用的。

Java 成为第一个在语言本身中显式地包含线程的主流编程语言,它使针对线程的操作不再那么神秘,因为它已经不再把线程看做是底层操作系统的工具。不过,虽然 Java 提供的线程工具和 API 看似简单,但是编写有效使用线程的复杂程序并不十分容易。因为有多个线程共存在相同的内存空间中并共享相同的变量,所以必须小心使用,从而确保线程不会互相干扰。

需求:

在网络中,数据传输的速率是远远低于计算机的处理能力的,就本地文件的读写而言,其读写速度也远低于CPU的处理能力。在传统的单任务环境中,程序 必须等待上一个任务完成以后才能执行下一个任务。例如当前某个程序运行过程中需要等待用户键盘输入的数据,由于键盘输入的速度相对于CPU的执行速度而言 要慢得多,这时候CPU就会空闲下来,直到收到键盘输入的数据,程序继续执行。

解决这种问题的办法就是引入多线程技术,Java提供了这样的技术,利用多线程技术编写的程序,可以使计算机同时并行运行多个相对独立的任务。例 如,可以创建一个线程来负责数据的输入和输出,而创建另一个线程在后台进行其他的数据处理,如果输入输出线程在接收数据时阻塞,而处理数据的线程仍然可以运行。这样,多线程程序设计就大大提高了程序执行效率和处理能力。

解决思路:(什么是线程,如何创建线程)

在掌握如何创建线程之前,先要了解一下什么是进程。进程(process)本质上是一个执行的程序。操作系统引入进程以后就允许计算机可以同时运行 两个或两个以上的程序,这就是多任务的处理模式。每一个进程都有自己独立的一块内存空间、一组系统资源。在进程概念中,每一个进程的内部数据和状态都是完全独立的。例如,基于进程的多任务处理功能不仅可以使我们在操作系统中使用记事本编辑文档,而且还可以同时听歌和看电影。

线程与进程相似,是一段完成某个特定功能的代码,是程序中单个顺序的流控制,但与进程不同的是,同类的多个线程是共享同一块内存空间和一组系统资源的,而线程本身的数据通常只有微处理器的寄存器数据,以及一个供程序执行时使用的堆栈。所以系统在产生一个线程,或者在各个线程之间切换时,负担要比进程 小得多,正因如此,线程也被称为轻型进程(light-weight process)。一个进程中可以包含多个线程。

多线程则指的是在单个程序中可以同时运行多个不同的线程,执行不同的任务。多线程意味着一个程序的多行语句可以看上去几乎在同一时间内同时运行。

同时运行的含义是指操作系统中管理的时间片会平均地分给每个线程,从而保证所有的线程都能够在极短的时间内得到处理。每一时间片内只能执行一个线程,但由于时间片是一个很小的时间单元,每一个线程又是很小的代码段,因此,操作系统能够在很短的时间内进行线程的切换,所以看起来就好像是多个任务可以 同时执行。

Java提供了线程类Thread来创建多线程的程序。其实,创建线程与创建普通的类的对象的操作是一样的,而线程就是Thread类或其子类的实例对象。每个Thread对象描述了一个单独的线程。要产生一个线程,有两种方法:

◆需要从Java.lang.Thread类派生一个新的线程类,重载它的run()方法;
◆实现Runnalbe接口,重载Runnalbe接口中的run()方法。

 

为什么Java要提供两种方法来创建线程呢?它们都有哪些区别?相比而言,哪一种方法更好呢?

在Java中,类仅支持单继承,也就是说,当定义一个新的类的时候,它只能扩展一个外部类.这样,如果创建自定义线程类的时候是通过扩展 Thread类的方法来实现的,那么这个自定义类就不能再去扩展其他的类,也就无法实现更加复杂的功能。因此,如果自定义类必须扩展其他的类,那么就可以使用实现Runnable接口的方法来定义该类为线程类,这样就可以避免Java单继承所带来的局限性。

还有一点最重要的就是使用实现Runnable接口的方式创建的线程可以处理同一资源,从而实现资源的共享.

(参考:http://hexudonghot.blog.163.com/blog/static/532043422010170122454/)

posted @ 2011-09-23 19:59  hardiman  阅读(1216)  评论(0编辑  收藏  举报