开篇:润墨网以专业的文秘视角,为您筛选了一篇浅析Java多线程机制范文,如需获取更多写作素材,在线客服老师一对一协助。欢迎您的阅读与分享!
摘要:本文在对java多线程分析的基础上,针对如何实现多线程,如何进行同步,如何管理多线程等问题进行了简单的阐述。
关键词:线程;多线程;线程组
中图分类号:TP311文献标识码:A文章编号:1009-3044(2008)19-30181-03
Analyse Shallowly Java Multi-threading Mechanism
WANG Jun-yu, WANG Xian-hong
(Sanmenxia Vocational and Technical College, Sanmenxia 472000, China)
Abstract: This text is based on the analysis of Java multi-threading mechanism, aim at how to carry out a multi-threading, how to carry on synchronously, how to manage multi-threading's etc.'s problem to carry on to expound in brief.
Key words: thread; multi-threading; thread group
1 理解多线程
传统的程序大多是单线程的,即一个程序只有一条从头至尾的执行线索。然而现实世界中的很多过程都具有多条线索同时动作的特性。例如:我们可以一边看书,一边摆动胳膊,如果不容许这样做,我们会感觉很难受。再如一个网络服务器可能需要同时处理多个客户机的请求等。
Java语言的一大特性就是内置对多线程的支持。多线程是这样的一种机制,它允许在程序中并发执行多个指令流,每个指令流都称为一个线程,彼此间互相独立。线程又称为轻量级进程,它和进程一样拥有独立的执行控制,由操作系统负责调度,区别在于线程没有独立的存储空间,而是和所属进程中的其它线程共享一个存储空间,这使得线程间的通信远较进程简单。
多个线程是并发执行的,也就是在逻辑上“同时”,而不管是否是物理上的“同时”。若系统只有一个CPU,真正的“同时”是不可能的,但是由于CPU的速度非常快,用户感觉不到其中的区别,因此我们也不用关心它,只需要设想各个线程是同时执行的即可。多线程和传统的单线程在程序设计上最大的区别在于,由于各个线程的控制流彼此独立,为了建立这些线程正在同步执行的感觉,Java快速地把控制从一个线程切换到另一个线程。
2 线程与程序、进程的区别
程序是一段静态的代码,它是应用软件执行的蓝本。
进程是程序的一次动态执行过程,它对应了从代码加载、执行至执行完毕的一个完整过程,这个过程也是进程本身从产生、发展至消亡的过程。如果把银行一天的工作比作一个进程,那么早上打铃上班是进程的开始,晚上打下班铃是进程的结束。
线程是比进程更小的执行单位。尽管线程在一些程序语言中又称为进程,但是基本的思想是相同的:一个线程是一个运行在后台的、独立于主应用程序的任务[2]。所有的程序至少自动拥有一个线程。这个线程称为主线程,当程序加载到内存中时,启动主线程。要加载第二个、第三个或者第四个线程,程序就要使用Thread类和Runnable接口。
3 在Java中实现多线程
在Java中实现多线程有两个途径:继承Thread类和实现Runnable接口。
3.1 继承Thread类的多线程程序设计方法
Thread 类是JDK中定义的用于控制线程对象的类,在该类中封装了用于进行线程控制的方法。见下面的示例代码:
import java.util.*;
class TimePrinter extends Thread {
int pauseTime;
String name;
public TimePrinter(int x, String n) {
pauseTime = x;
name = n;
}
public void run() {
while(true) {
try {
System.out.println(name + ":" + new
Date(System.currentTimeMillis()));
Thread.sleep(pauseTime);
} catch(Exception e) {
System.out.println(e);}}}
static public void main(String args[]) {
TimePrinter tp1 = new TimePrinter(1000, "Fast Guy");
tp1.start();
TimePrinter tp2 = new TimePrinter(3000, "Slow Guy");
tp2.start();}}
这种方法简单明了,符合我们的习惯,但它有一个很大的缺点,那就是如果我们创建的类已经从一个类继承(如小程序必须继承自 Applet 类),那么无法再继承 Thread 类,而这时我们又不想建立一个新的类,怎么办呢?我们可以这样做:就是不创建 Thread 类的子类,而是直接使用它,若直接使用Thread类,那就需要Runnable接口支持。虽然抽象类也可满足,但需要继承,为了避免继承带来的限制,则只有使用Java 提供的接口 java.lang.Runnable 来支持。
3.2 实现Runnable接口的多线程程序设计方法
Java语言中提供的另外一种实现多线程应用程序的方法是多线程对象实现Runnable接口并且在该类中定义用于启动线程的run方法。这种定义方式的好处在于多线程应用对象可以继承其它对象而不是必须继承Thread类,从而能够增加类定义的逻辑性。实现Runnable接口的多线程应用程序如下所示:
public class MyThread implements Runnable {
int count= 1, number;
public MyThread(int num) {
number = num;
System.out.println("创建线程 " + number);
}
public void run() {
while(true) {
System.out.println("线程 " + number + ":计数 " + count);
if(++count== 6) return;
} }
public static void main(String args[]) {
for(int i = 0; i < 5; i++) new Thread(new MyThread(i+1)).start();}}
使用 Runnable 接口来实现多线程使得我们能够在一个类中包容所有的代码,有利于封装,它的缺点在于,我们只能使用一套代码,若想创建多个线程并使各个线程执行不同的代码,则仍必须额外创建类,如果这样的话,在大多数情况下也许还不如直接用多个类分别继承 Thread 来得紧凑。这两种方法,各有千秋,可灵活使用。