多线程

多线程的创建与原理

多线程跟同步异步相似

同步:同步是按照顺序一个一个来向后台发送请求,不会乱掉,

异步:异步是一块发送请求,谁先发送先读取谁,没有顺序

并发与并行

并发并行和同步异步相似

并发是指在一个处理器上处理多个任务

并发目的是充分的利用处理器的每一核,以达到最高的处理性能

并行是指多台处理器处理多个任务

并行是指在一时刻,有多条指令在多个处理器上同时执行。

所以无论从微观还是从宏观来看,二者都是一起执行的

线程与进程

进程:一个应用程序的启动都会有一个进程,可以有多个进程,每个一个用程序都会有独立的内存空间

线程:线程是进程的一个执行单元,一个进程中至少有一个线程可以有多个线程

创建线程类的方法

1、类继承Thread父类

使用方法

​ 先创建类继承Thread然后重写run方法;直接new创建的类名传值

2、类实现Runnable接口

使用方法

​ 先创建类实现接口Runnable;先new 实现的类,然后new Thread传入new的实现类

Thread和Runnable的区别

继承Thread不适合资源共享,实现Runnable接口则很容易的实现资源共享

线程优先级

多线程执行的时候,需要各自争抢时间片,每一个线程能否抢到全看脸

优先级越高的线程CPU资源较多,也是CPU优先执行优先级较高的线程对象中的任务

守护线程和用户线程

用户和线程存在,守护线程你不会关闭,只有没有了用户线程守护线程再回自动关闭,用户线程不会自动关闭

用户线程也已而转换为守护线程用

thread.setDaemon(ture)必须在thread.start()之前设置

线程安全

多线程问题

在堆内存中的数据由于可以被任何线程访问到,在没有限制的情况下存在被意外修改的风险。

有三种方式完成同步操作解决线程安全问题:

  1. 同步代码块

    synchronized(同步锁){

    }

    可以用于方法中的某个区块中,表示只对这个区块的资源实行互斥访问。

    在任何时候,最多允许一个线程拥有同步锁,谁拿到锁就进入代码块,其他的线程只能在外等着 (BLOCKED)。

  2. 同步方法

    在方法上修饰,跟修饰静态使用方法一样

    使用synchronized修饰的方法,就叫做同步方法,保证A线程执行该方法的时候,其他线程只能在方法外等着。

  3. 锁机制

    先创建一个锁机制

    Lock reentrantlock = new Reentrantlock();

    reentrantlock .lock();

    锁的代码块

    reentrantlock .unlock();

    同步代码块/同步方法具有的功能Lock都有,除此之外更强大,更体现面向对象。

线程的状态

开启线程

new 继承线程的类.start()

进入等待状态,该线程不在参与资源抢夺;必须被通知才能继续执行

object.wait()

通知随机一个等待的状态线程

object.ontify()

通知所有的的等待的线程

object.ontifyAll()

抢夺到资源后进行2秒的休眠,之后再进行

Thread.sleep(2000);

线程池

为什么使用线程池

我们使用线程是就会常见一个线程,这样频繁创建线程就会大大降低系统的效率,因为频繁的创建和销毁需要时间。

**线程池:**就是一个容纳多个线程的容器,其中的线程可以反复使用,省去了频繁创建线程对象的操作,无需反复创建线程而消耗过多的资源

线程池的使用
public static void main(String[] args) {
    	//创建一个缓存线程池
        ExecutorService es = Executors.newCachedThreadPool();
        for(int i= 0;i<20;i++){
            final int index = i;
            //调用execute方法添加要执行的线程任务(操作)
            es.execute(new Runnable() {
                @Override
                public void run() {
                    System.out.println(Thread.currentThread().getName()+"--->"+index);
                }
            });
        }
    }

newCachedThreadPool(缓存线程池)

特点:会根据需要创建新线程,如果线程池中有可复用的,会先复用可用的。

	 这个线程池典型的场景是改善 任务耗时短小的异步任务。

​ 使用execute可以复用可用的线程。如果没有可用线程,会创建新线程并添加到线程池里。

​ 那些1分钟没有被使用的线程将被停止并从缓存里移除。

newFixedThreadPool(int threadCount) 定容线程池

特点:

可以复用指定数目的线程

如果请求的线程数目大于目前idle的,那么多余的请求将被等待,直到线程池中有可用的线程。

如果有任何线程执行过程中停止了,将会新建一个线程代替。

线程池中的线程一直存活,直到显式的使用shutdown关闭。

newScheduledThreadPool(定时线程池)

特点:

支持定时及循环任务执行

延迟定时,延迟的时间间隔是从调用开始,开始计算的,并不受线程执行时间长短的影响

newSingleThreadScheduledExecutor(单一线程池)

特点:最多只开启一个线程,对于队列中的Runnable,挨个执行

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值