IO流暂且告一段落,开始多线程技术的学习。
一. 多线程 概述
多线程是Java的重要特性,大量应用于网络编程、服务器端程序的开发等等领域。
比如我们可以流畅的点击软件或者游戏中的各种按钮,其实,底层就是多线程的应用。再比如我们可以成百上万人同时访问某个网站,其实,也是基于网站服务器的多线程原理。如果没有多线程,服务器处理速度会极大降低。
二. 程序
“程序(Program)”是一个静态的概念,一般对应于操作系统中的一个可执行文件。
比如:我们要启动网易云音乐听歌,则打开的是对应网易云音乐的可执行程序。
三. 进程
当我们双击网易云,操作系统就会加载程序到内存中,开始执行该程序,于是产生了“进程”。
执行中的程序叫做进程(Process),是一个动态的概念。现代的操作系统都可以同时启动多个进程。比如:我们在听音乐的同时也可以使用eclipse写代码,也可以同时用浏览器查看网页。
进程具有如下特点:
- 进程是程序的一次动态执行过程, 占用特定的地址空间。
- 每个进程由3部分组成:cpu、data、code。每个进程都是独立的,有自己的cpu时间,代码和数据,即便用同一份程序产生好几个进程,它们之间还是拥有自己的这3样东西,这样的缺点是:浪费内存,cpu的负担较重。
- 多任务(Multitasking [ˌmʌltiˈtɑːskɪŋ] )操作系统将CPU时间动态地划分给每个进程,操作系统同时执行多个进程,每个进程独立运行。
四. 线程
一个进程可以产生多个线程(thread),线程又被称为轻量级进程(lightweight process)。线程可以理解成是在进程中独立运行的子任务。比如,QQ.exe 运行时就有很多的子任务在同时运行。像好友视频、下载文件、传输数据、发送表情等,这些不同的任务或者说功能都可以同时运行。
同一进程的多个线程也可以共享此进程的某些资源(比如:代码、数据等)。
进程和程序的区别:
程序是一组指令的集合,它是静态的实体,没有执行的含义。
而进程是一个动态的实体,有自己的生命周期。
一般说来,一个进程肯定与一个程序相对应,并且只有一个,但是一个程序可以有多个进程,或者一个进程都没有。简单地说,程序运行的时候会产生进程。
线程和进程的区别:
线程是进程的一部分,所以线程有的时候被称为轻量级进程。 线程和进程最根本的区别在于:进程是资源分配的单位,线程是调度和执行的单位。
- 多进程: 在操作系统中能同时运行多个程序。
- 多线程: 在同一应用程序中有多个顺序流(不同子任务)同时执行。
方法间的调用和多线程的使用:
好了,先不管那么多,看看Java是如何实现多线程的:
一般使用上述三种方式,前两种方式最为常用。
五. 继承Thread类实现多线程
这一章的代码不需要自己想,也千万别乱想,有太多的原理性的知识是无法一下子接受的。那怎么实现呢?按照规定步骤来:
- 写自己的类,继承java.lang.Thread类;
- 重写Thread类的方法run( )来实现多线程(run方法中的程序代码便是“子任务”)。方法run( )称为线程体。
- 通过调用Thread类的start()方法来启动一个线程。
测试一下:
package cn.zjb.thread;
/**
* 测试实现多线程的第一种方法——继承Thread类。
* @author 张坚波
*
*/
public class TestExtendsThread extends Thread{
@Override
public void run() {
for(int i=0;i<10;i++)
System.out.println("\t这是一个子任务");
}
public static void main(String[] args) {
TestExtendsThread tet=new TestExtendsThread();
tet.start(); //不是立即运行的,并且一定要先调用!
for(int i=0;i<5;i++)
System.out.println("这是一个主任务");
}
}
每次运行结果可能不一样:
六. 实现Runnable接口实现多线程
和刚才继承Thread类的代码基本一致,只不过Runnable接口中没有start()具体方法体,我们需要在原来的步骤最后,用一个Thread类对象作为一个“代理”,以便使用它里面的start()方法。
package cn.zjb.thread;
/**
* 实现Runnable接口实现多线程。
* @author 张坚波
*
*/
public class TestRunnable implements Runnable {
public void run() {
for(int i=0;i<10;i++)
System.out.println("\t这是一个子任务");
}
public static void main(String[] args) {
new Thread(new TestRunnable()).start();
for(int i=0;i<5;i++)
System.out.println("这是一个主任务");
}
}
这周不打算继续学了,先稍微认识一下多线程。先把汇编、操作系统、数据库的课预习复习完。