[ 永远的UNIX::UNIX技术资料的宝库 ]

首页 > 编程技术 > Java > 正文
 

如何使用Java编写多线程程序(1)

作者:贾波 来源:Java中文站 (2006-05-24 10:32:41)

 

一、简介

1、什么是线程

要说线程,就必须先说说进程,进程就是程序的运行时的一个实例。线程呢可以看作单独地占有CPU时间来执行相应的代码的。对早期的计算机(如DOS)而言,线程既是进程,进程既是进程,因为她是单线程的。当然一个程序可以是多线程的,多线程的各个线程看上去像是并行地独自完成各自的工作,就像一台一台计算机上运行着多个处理机一样。在多处理机计算机上实现多线程时,它们确实可以并行工作,而且采用适当的分时策略可以大大提高程序运行的效率。但是二者还是有较大的不同的,线程是共享地址空间的,也就是说多线程可以同时读取相同的地址空间,并且利用这个空间进行交换数据。

2、为什么要使用线程

为什么要使用多线程呢?学过《计算机体系结构》的人都知道。将顺序执行程序和采用多线程并行执行程序相比,效率是可以大大地提高的。比如,有五个线程thread1, thread2, thread3, thread4, thread5,所耗的CPU时间分别为4,5,1,2,7。(假设CPU轮换周期为4个CPU时间,而且线程之间是彼此独立的)顺序执行需要花费19个CPU时间,而并行需要的时间肯定少于19个CPU时间,至于具体多少时间要看那些线程是可以同时执行的。这是在非常小规模的情况下,要是面对大规模的进程之间的交互的话,效率可以表现得更高。

3、java中是如何实现多线程的

与其他语言不一样的是,线程的观念在java是语言中是重要的,根深蒂固的,因为在java语言中的线程系统是java语言自建的, java中有专门的支持多线程的API库,所以你可以以最快的速度写一个支持线程的程序。在使用java创建线程的时候,你可以生成一个Thread类或者他的子类对象,并给这个对象发送start()消息(程序可以向任何一个派生自 Runnable 接口的类对象发送 start() 消息的),这样一来程序会一直执行,直到run返回为止,此时该线程就死掉了。

在java语言中,线程有如下特点:

§ 在一个程序中而言,主线程的执行位置就是main。而其他线程执行的位置,程序员是可以自定义的。值得注意的是对Applet也是一样。

§ 每个线程执行其代码的方式都是一次顺序执行的。

§ 一个线程执行其代码是与其他线程独立开来的。如果诸线程之间又相互协作的话,就必须采用一定的交互机制。

§ 前面已经说过,线程是共享地址空间的,如果控制不当,这里很有可能出现死锁。

各线程之间是相互独立的,那么本地变量对一个线程而言就是完全独立,私有的。所以呢,线程执行时,每个线程都有各自的本地变量拷贝。对象变量(instance variable)在线程之间是可以共享的,这也就是为什么在java中共享数据对象是如此的好用,但是java线程不能够武断地访问对象变量:他们是需要访问数据对象的权限的。

二、准备知识

在分析这个例子之前,然我们先看看关于线程的几个概念,上锁,信号量,和java所提供的API。

上锁

对于大多数的程序而言,他们都需要线程之间相互的通讯来完成整个线程的生命周期,二实现线程之间同步的最简单的办法就是上锁。为了防止相互关联的两个线程之间错误地访问共享资源,线程需要在访问资源的时候上锁和解锁,对于锁而言,有读锁,写锁和读写锁等不同的同步策略。在java中,所有的对象都有锁;线程只需要使用synchronized关键字就可以获得锁。在任一时刻对于给定的类的实例,方法或同步的代码块只能被一个线程执行。这是因为代码在执行之前要求获得对象的锁。

信号量

通常情况下,多个线程所访问为数不多的资源,那怎么控制呢?一个比较非常经典而起非常简单的办法就是采用信号量机制。信号量机制的含义就是定义一个信号量,也就是说能够提供的连接数;当有一个线程占用了一个连接时,信号量就减一;当一个线程是放了连接时,信号量就加一。采用这种方法就可以简单有效地控制线程的同步问题,而且实现起来也特别方便。看下面的代码:

class Semaphore {

private int count;

public Semaphore(int count) {

this.count = count;

}

public synchronized void acquire() {

while(count == 0) {

try {

wait();

} catch (InterruptedException e) {

//keep trying

}

}

count--;

}

public synchronized void release() {

count++;

notify(); //alert a thread that´s blocking on this semaphore

}

}

java中提供了哪些api以编写多线程程序

这里只列出几个常用的方法和属性值。

属性值,有三个MAX_PRIORITY,MIN_PRIORITY,NORM_PRIORITY

方法:

Thread(); //建立一个线程

void run(); //对于一个继承了Runnable接口的class而言,

//他运行一个线程,否着他什么都不做

void setPriority(int newPriority); //设置优先级

void start(); //运行一个程序

void sleep(long millis); //线程睡眠millis毫秒

static void yield(); //临时pause一个程序以便起他线程运行


(http://www.fanqiang.com)



 
 相关文章
Solaris 8 新增功能一览--(1)IPv6,LDAP,Java增强 2001-06-13 10:08:01
JAVA入门教程: 第 一 章  Java概述 2001-04-16 15:07:00
JAVA入门教程: 第 二 章 数 据 类 型 2001-04-16 15:08:15
JAVA入门教程: 第 三 章 运算符和表达式 2001-04-16 15:09:16
JAVA入门教程: 第 四 章 流 控 制 2001-04-16 15:10:00
JAVA入门教程: 第 五 章 数 组 2001-04-16 15:10:37
JAVA入门教程: 第 六 章 对 象、类、包和接口 2001-04-16 15:11:52
JAVA初学常见问题 2001-04-16 15:13:54
Java及Web应用(一) 2001-04-21 17:19:33
Java及Web应用(二) 2001-04-21 17:22:26
基于java servlet技术的留言簿 2001-04-21 17:36:45
Javascript源码:计算器 2001-05-19 08:42:55
Javascript源码:时间按钮 2001-05-17 14:26:12
Javascript源码:只显示当前日期 2001-05-17 14:28:10
Javascript源码:显示当前日期与时间 2001-05-14 16:45:08
JAVA Servlets简介 2001-05-30 12:10:00
很棒的JavaScript!!(弹性) 2001-06-03 10:08:00
Forte for Java简介与基础安装 2001-06-07 14:08:00
Java编程技巧(信号量,管道) 2001-06-08 15:00:00
JAVA的网络功能与编程 2001-06-26 14:08:00
 

★  感谢所有的作者为我们学习技术知识提供了一条捷径  ★
www.fanqiang.com