进程的定义:
进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动
进程的特征:
- 结构特征
- 动态性
- 并发性
- 独立性
- 异步性
线程的定义:
线程(thread) 是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。
作用
- 减少开销
- 提高效率
进程:是并发执行的程序在执行过程中分配和管理资源的基本单位,是一个动态概念,竞争计算机系统资源的基本单位。
线程:是进程的一个执行单元,是进程内科调度实体。比进程更小的独立运行的基本单位。线程也被称为轻量级进程。
一个程序至少一个进程,一个进程至少一个线程
线程存在的原因:
每个进程都有自己的地址空间,即进程空间,在网络或多用户换机下,一个服务器通常需要接受大量不确定数量用户的并发请求,为每一个请求都创建一个进程显然行不通(系统开销大,响应用户请求效率低),因此操作系统中线程概念被引进。
进程和线程的区别:
- 地址空间:同一进程的线程共享本进程的地址空间,而进程之间是独立的地址空间。
- 资源拥有:同一进程内的线程共享本进程的资源,如内存、I/O、CPU等,但是进程之间的资源是独立的。
- 一个进程崩溃后,在保护模式下不会对其他进程产生影响,但是一个线程崩溃整个进程都将死掉。所以,多进程要比多线程健壮。
- 进程切换时,消耗的资源大,效率高。所以涉及到频繁的切换时,使用线程要好于进程。同样如果要求同时进行并且又要共享某些变量的并发操作,只能用线程不能用进程。
- 执行过程:每一个独立的进程有一个程序运行的入口、顺序执行序列和程序入口。但是线程不能独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。
- 线程是处理器调度的基本单位,但进程不是。
- 两者均可并发执行
阻塞是CPU 闲等状态
考虑使用线程的情况:
1. 高并发:多用户请求的高并发
2. 线程后台处理大任务:执行程序需要花大量的时间。
3. 大任务
使用线程的好处:
- 使用线程可以把占据长时间的程序中的任务放到后台去处理
- 用户界面可以更加吸引人
- 程序运行的速度可能加快
- 释放内存
程序&&进程&&线程
- 程序(Program) :是一段静态的代码,它是应用软件执行的蓝本。
- 进程(Process) :是程序的一次执行过程,是系统进行程序的基本单位。
- 线程(Thread) : 是比进程更小的执行单位。相当于一个任务中的一条执行路径。
多任务的实现
- 多进程:在操作系统中能同时运行多个任务(程序)
- 多线程:在同一个应用程序中有多个顺序流同时执行
多线程的目的是为了最大限度的利用CPU资源
Java中实现多线程的方法有两种:
1. 继承java.lang包中的Thread类
2. 用户在定义自己的类中实现Runnable接口
Thread类
- 直接继承Object类,并实现Runnable接口,位于java.lang包中。
- 封装了线程对象需要的属性和方法
- 继承Thread类——创建多线程的方法之一
从Thread类派生一个子类,并创建一个对象
子类应该重写Thread类的run方法,写入在新线程中需要执行的语句段。
调用start方法来启动新线程,自动进入run方法
1.Thread类的子类来创建线程
- 定义一个Threa的子类并重写run方法:
class MyThread extends Thread{
public void run(){
...
}
}
- 生成该类的对象:
MyThread myThread = new MyThread();
- 启动或运行线程,Java虚拟机会自动启动线程,从而Java虚拟机进一步统一调动线程,实现各个线程一起并发的运行。
public void start(){
myThread.strat();
}
下面举个栗子😁
class Demo extends Thread{
public void run() {
for(int x = 0;x < 60;x++)
{
System.out.println("Demo run--"+x);
}
}
}
public class ThreadstartDemo {
public static void main(String[] args) {
// TODO Auto-generated method stub
Demo d = new Demo();
d.start();
for(int x = 0;x < 60;x++)
{
System.out.println("Hello World--"+x);
}
}
}
运行结果:
- 发现运行结果每次都不同。因为多个线程都获取CPU执行权,CPU执行到谁,谁就运行。在某一时刻,只能由一个线程在运行(多核除外)。
- CPU在做着快速的切换,以达到看上去是同时执行的效果。
- 多线程的特性:随机性
下面我们来看一个栗子:创建两个线程和主线程交替运行
class Demo2 extends Thread{
private String name;
Demo2(String name){
this.name = name;
}
public void run() {
for(int i = 0;i < 60;i++)
{
System.out.println(name + "run......" +i);
}
}
}
public class TwoThreadMainTurnRun {
public static void main(String[] args) {
// TODO Auto-generated method stub
Demo2 d1 = new Demo2("one");
Demo2 d2 = new Demo2("two");
d1.start();
d2.start();
for(int i = 0;i < 60;i++)
{
System.out.println("main......" +i);
}
}
}
运行结果: