线程是指进程的一条执行路径 ,它包含独立的堆栈和 CPU 寄存器状态 ,每个线程共享所有的进程资源 ,包括打开的文件、信号标识及动态分配的内存等等。当一个程序开始运行时 ,它就是一个进程 ,进程是指包括运行中的程序和程序所使用到的内存和系统资源。而一个进程又是由多个线程所组成的 ,线程是程序中的一个执行流 ,每个线程都有自己的专有寄存器 (栈指针、 程序计数器等 ) ,但代码区是共享的 ,即不同的线程可以执行同样的函数。多线程是指程序中包含多个执行流 ,即在一个程序中可以同时运行多个不同的线程来执行不同的任务 ,也就是说允许单个程序创建多个并行执行的线程来完成各自的任务。
多线程是这样一种机制,它允许在程序中并发执行多个指令流,每个指令流都被称为一个线程,线程间互相独立。
线程又称为轻量级进程,它和进程一样拥有独立的执行控制,由操作系统负责调度,区别在于线程没有独立的存储空间,而是和所属进程中的线程共享一个存储空间,这使得线程间的通信远较进程简单。 多个线程的执行是并发的,也就是在逻辑上“同时”,而不管是否是物理上的“同时”。如果系统只有一个 CPU,那么真的“同时”是不可能的,但是由于CPU 的速度非常快,用户感觉不到其中的区别是,因此我们只需要设想各个线程是同时执行即可。在 JAVA 中提供了类 java.lang.Thead 来进行多线程编程。
多线程的好处在于可以提高 CPU 的利用率 ,任何一个程序员都不希望自己的程序很多时候没事可干 ,在多线程程序中 ,一个线程必须等待的时候 , CPU 可以运行其它的线程而不是等待 ,这样就大大提高了程序的效率。
多线程是将程序任务分成几个并行的任务, 由每个线程并发执行。当一个应用程序中的线程个数大于 1 时, 就称为多线程。当创建一个进程时, 操作系统会自动创建这个进程的第一个线程, 成为主线程。此后, 主线程可以创建其他线程, 进而实现多线程。多线程下载就是要创建多个下载的线程, 每个线程按分配的下载字节数, 下载文件的各个部分。
多线程下载的前提是网络的连通和通信软件与协议的应用。 从服务器下载文件, 是客户端与服务器的交互过程, 采用的文件传输协议有多种, 最常见的是 HTTP (超文本传输协议)和 FTP (文件传送协议)。本软件是基于 HTTP 实现的。当向服务器发送 HTTP 请求成功后, 可以进行下载。采用多线程下载, 就是要创建多个下载线程, 分别下载文件的不同部分。在这个多线程下载工具的设计中, 创建了 3 个线程分别与服务器连接, 每个线程传输文件的一部分。 通过多个线程同时与服务器连接, 可以获取到较高的带宽。
每个线程下载的数据都会保存在个自定义的一个 buffer 中,等待所有线程下载结束后,每个线程 buffer 中的内容会就写入到文件中,组合成一个完整的文件。 参见 6.3 线程下载类代码。 声明一个线程,再用循环的方式实现多线程。线程实现方式用以下二种方式: (1)声明一个 Thread 类的子类,并覆盖其 ren()方法。
Class mythread extends Thread
{
public void run( )
{
/*覆盖方法*/
}
}
(2)声明一个实现 Runnable 接口的类,并实现 run( )方法。
Class mythread implements Runnable
{
public void run( )
{
/*实现该方法*/
}
}
在多线程调度中,在此基础上用以下循环方式实现多个线程:
private void startDownFile()
{
//开始下载
down=new DownLoadThread[myDownInfo.getThreadNum()];
for(int i=0;i<down.length;i++)
{
down[i]=new DownLoadThread(myDownInfo,i);
down[i].setPriority(7);
down[i].start();
}
}