多线程-->进程和线程 及 多线程的两种创建方式

多线程

多线程是为了解决 提高程序的执行效率或者从根本上提高CPU的执行效率而来
进程和线程的区别

进程

就是正在运行的程序。可以打开任务管理器查看。一个软件一个程序的运行可以依赖一个进程或者多个进程。

特点:

独立性:进程是系统中独立存在的实体,它可以拥有自己的独立的资源,每一个进程都拥有自己私有的地址空间。在没有经过进程本身允许的情况下,一个用户进程不可以直接访问其他进程的地址空间。

动态性:进程与程序的区别在于,程序只是一个静态的指令集合,而进程是一个正在系统中活动的指令集合。在进程中加入了时间的概念,进程具有自己的生命周期和各种不同的状态,这些概念在程序中都是不具备的。

并发性:多个进程可以在单个处理器上并发执行,多个进程之间不会互相影响。

线程

操作系统能够进行运算调度的最小单位,是进程的实际运作单位。一个软件的运行最少依赖一个进程,一个进程的运行最少依赖一个线程. 一个进程包含一个线程就是单线程程序,也可以包含多个线程就是多线程程序

线程概念图:
在这里插入图片描述

进程和线程的关系:

进程有独立的存储空间,可以存线程,也可以有多个线程共享的空间、线程有独立空间,线程间暂时无法通信。线程之间也是独立的。

一个操作系统中可以有多个进程,一个进程中可以有多个线程,每个进程有自己独立的内存,每个线程共享一个进程中的内存,每个线程又有自己独立的内存。

进程和线程关系概念图: (整个大框是进程, 一个Thread是一个线程)
在这里插入图片描述
并发和并行的区别:
并发
多个程序抢占了同一个CPU资源。形成了资源被抢占的现象。例如:抢购秒杀!

并行
有多个CPU,每个CPU只负责一件事情,没有发生抢占现象

多线程的特点
随机性:
是指,操作系统的程序执行权,会交给CPU,CPU我们控制不了,全都是操作系统调度的。
线程状态 :
新建状态、可运行状态、运行状态、终止状态、阻塞状态。

线程实现的两种方式

一:继承Thread类
普通方式:

public class Test1_Thread {
    public static void main(String[] args) {
        MyThread target = new MyThread();

        // 执行run()...
        // target.run(); // 可以执行业务, 但是没有多线程效果, 相当于普通方法
        // 应执行start()启动线程
        target.start(); // 从新建状态变成了可运行状态, 等待cpu调度
    }
}

// 继承Thread类
class MyThread extends Thread {
    @Override
    public void run() {
        // 线程执行的代码
    }
}

匿名对象方式:

new Thread(){
    public void run() {
		// 线程执行的代码
    }
}.start();

二:实现Runnable接口
普通实现方式

public class Test2_Runnable {
    public static void main(String[] args) {
        MyRunnable mr = new MyRunnable();
        Thread  t = new Thread(mr);
        t.start();
    }
}

class MyRunnable implements Runnable {
    @Override
    public void run() {
        // 线程执行的代码
    }
}

匿名内部类方式

Runnable r2 = new Runnable() {
    public void run() {
		// 线程执行代码
    }
};
new Thread(r2).start();

// 可简写为
new Thread(new Runnable() {
   public void run() {
		// 线程执行代码
    }
}).start();
匿名内部类和匿名对象

匿名内部类: 不需要类名, new一个接口

众所周知, 接口不能被实例化, 但是new一个接口的代码是可行的, 但是, 这并不表示这个接口被实例化了, 而是实例化了一个没有名字的类. 如下代码: (以下代码和线程无关)

// main方法中的代码
new Runnable() {
    @Override
    public void run() {
  	// 方法体
    }
};
实际上他是这样的
class 匿名 implements Runnable {
    @Override
    public void run() {
        // 方法体
    }
}
// 下面是main方法中的代码
new 匿名().run();

匿名内部类是一个一次性的类. 即: 这个类只能被实例化一次, 且这个类的方法也只能执行一次
匿名对象: 不需要变量, new一个对象
匿名对象 比如: new Thread()这样的, 一个没有名字的Thread对象, 匿名对象是一个一次性的对象, 即: 这个对象只能存在一次.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值