Java多线程技术
多线程是这样一种机制,它允许在程序中并非执行多个指令流,每个指令流都被称为一个线程,线程间相互独立。
在Java中提供了java.lang.Thread来进行多线程编程。在基于Java的应用程序中可以通过以下两种方式来创建线程对象。
- 声明一个Thread类的子类,并覆盖其run()方法。
- 声明一个实现Runnable接口的类,并实现run()方法。
Thread类提供了大量的方法来控制线程的执行过程。要触发一个新的线程,需要调用start()方法。在调用start()方法时,讲创建一个新的控制线程,新线程进入可运行状态,它将向线程调度器注册这个线程,然后它将调用run()方法。
Thread中定义的一些方法:
方法 |
说明 |
start() |
新建的线程进入可运行状态 |
run() |
线程进入正在运行状态 |
wait() |
线程进入等待状态,等待被唤醒 |
notify()/notifyAll() |
唤醒其他的线程 |
yield() |
线程放弃执行,使其他优先级不低于此线程的线程有机会运行 |
getPriority()/setPriority() |
获得/设置线程的优先级 |
suspend() |
挂起该线程 |
resunme() |
唤醒该线程,与suspend()方法相对 |
sleep() |
线程睡眠指定的一段时间 |
join() |
调用这个方法的主线程,会等待加入的子线程完成 |
?
详细可以看下别人的博客:http://www.cnblogs.com/dolphin0520/p/3920357.html
在实现下载工具系统的过程中,需要定义一个线程下载类,这也是该系统的核心技术。下面是线程现在类的大框架。 /** * 下载线程类 */ public class DownLoadThread extends Thread{ ????public DownLoadThread(DownLoadInfo downInfo, int threadId){ ????????//构造函数 ????} ? ????/** ???? * 获取线程下载是否结束标志 ???? */ ????public boolean ifFinished(){ ????????return finished; ????} ? ????/** ???? * 获取线程下载是否出错标志 ???? */ ????public boolean isError(){ ????????return err; ????} ? ????//覆盖Thread类中的run()方法 ????public void run(){ ????????/** ???? ???? * 实现根据下载的起始位置和结束位置下载文件某一段的逻辑代码 ???? ???? */ ????} } |
?
Java I/O流技术
为了进行数据的输入/输出操作,Java中把不同的输入/输出源抽象表述为"流"(stream)。Java.io包中定义了多个流类型来实现输入/输出功能。
按照流的方向划分,可以分为输入流和输出流。
- 输入了:只能从中读取字节数据,而不能向其写入数据。
- 输出流:只能向其写入数据,而不能从中读取数据。
按照流所处理的数据类型划分,可以分为字节流和字符流。
- 字节流:用于处理字节数据。
- 字符流:用于处理Unicode字符数据。
按照流是否可以直接访问资源划分,可以分为节点流和处理流。
- 节点流:可以从(向)一个特定的I/O设备读(写)数据的流,节点流也被称为低级流。
- 处理流:用来实现对一个已存在的流的连接和封装,是通过所封装的流的功能,调用实现数据读/写操作的流,处理流也被称为高级流。
Java.io包支持两种类型的流,包括二进制数据的字节流和包括字符数据的字符流。在读/写数据时,这两种流以不同的方式工作。
在java.io包中,InputStream和OutPutStream类及它们的子类均表示字节流,并且提供了读/ 写二进制数据的方法。
InputStream类中包含3个read()方法,用来从数据流中读取二进制数代码。
输入流的基本方法:
- read(),这个方法在InputStream类中是抽象的,因此它必须定义在子类中。此方法以int类型返回流的下一个可读字节。如果到达流的末尾,则方法的返回值为-1,如果I/O发送错误,将抛出IOException类型异常。
- read(byte[] array),此方法将流中字节读到数组的连续元素中,读出的字节数据最大为array.length的值。在读取完输入数据或是检测到流尾时,才从本方法返回。本方法返回读取的字节个数,或者如果因为到达流尾而没有读取任何字节则返回-1,。如果I/O发送错误,将抛出IOException类型异常。如果传给方法的参数为null,则派出NullPointerException异常。
- read(byte[] buffer, int offser, int length),此方法将数据读入一个字节数组,从数组的offert指定的位置开始存放,并用length来指定读取的最大字节数。
输入流的其他方法如下:
- void close(),关闭流。
- int available(),返回可以从中读取的字节流。
- long skip(long n),在输入流中跳过n个字节,将实际跳过的字节数返回。
- boolean markSupported(),判断流是否支持标记功能、
- void mark(int readlimit),在支持标记的输入流的当前位置设置一个标记。
- void reset(),返回到流的上一个标记。
?
OutputStream类包含3个write()方法,用来向数据流写入二进制代码。这些操作与InPutStream类的read()方法向对应。
输出流的基本方法:
- void write(int c)
- void write(byte[] buffer)
- void write(byte[] buffer, int offdet, int length)
?
详细可以看下别人的博客:http://blog.csdn.net/yczz/article/details/38761237
在实现下载工具系统的过程中主要涉及两部分的Java流操作,一个是从打开的URL连接中获得网络的输入流,一个是想文件写入内容的输出流。 |