【20230516】进程/线程/同步/异步

Summary:  多线程:进程/线程/同步/异步/它们的方法

一、进程和线程

1、进程:计算机中正在运行的独立的程序
   线程:在进程中的一个单一顺序的控制流。一个进程会有很多个线程,这些线程类似平行运行。
(其实是把时间线切的很小,多线程交错运行。其中某一程序报错不影响其他程序继续运行。)
   二者区别:
      进程是独立运行的程序,运行时会占用独立的CPU进行计算,进程之间数据不能共享。
      线程是进程内部的执行流,会根据线程个数来分配CPU,线程之间共享CPU(会抢),线程之间能够共享数据

2、如何创建线程
     继承 Thread: Thread01 t1 = new Thread01();   
     实现Runnable接口: Thread t1 = new Thread(new MyRunnable());
     继承 Thread 和实现Runnable 接口的时候都需要重写run()方法。

    线程在启动之后并不是立即按照顺序执行的,谁先抢到CPU谁先执行。
    方法们:1)启动:run();  start();二者区别:run相当于调用一个普通的方法,不会创建一个线程(所以会是按顺序执行的)。而start是启动,是建立了一个线程然后执行线程,执行线程的时候再调用run。        
           2)t.setName、Thread.currentThread().getName(获得setname设置的名字)
           3)t.setPriority(Thread.MAX_PRIORITY):设置优先顺序。虽然设置了t的最大值,但也不一定能够百分百确定其是第一个执行的,只能说跑很多次中,t先被执行的概率较大。因为多线程无法控制谁先谁后,全靠抢。
           4)Thread.join、Thread.yield(让步:不写的话就是抢,两个都写就有大概率是你1我1的形态)、Thread.sleep

3、守护线程Daemon
Daemon:也叫精灵线程. 当主线程执行时,守护线程也实行,当主线程关闭或结束时,守护线程提前结束.
先建一个Daemon 的类继承Thread ,然后创建对象,然后调用d.setDaemon(true);
JVM的垃圾回收其实就是守护线程。

4、线程的生命周期:
   1) new 新建阶段:该线程被创建,即处于新建状态,此时线程还未启动.
   2) 就绪阶段 runnable:start方法被调用,线程等待CPU.注意此时线程并未执行. 
   3)运行阶段 Running阶段:该线程已经获取CPU,开始执行线程体中的run方法. join.yield方法.会使线程由running状态.进入到runnable状态,重新等待CPU.
   4)阻塞阶段 block:当线程调用了sleep方法.线程进入到睡眠(阻塞,挂起)状态.主动放弃占用的CUP.当阻塞结束,进入到runnable状态.重新等待CPU.
如 sc。next()就是阻塞阶段
   5)死亡阶段:当线程执行结束,进入Dead状态.此时线程完全放弃CPU. 线程执行死亡后,不能再次唤醒.不能再次执行.


二、同步和异步:线程与数据是否同步或异步
1、同步 Sync:用户和座位一对一锁定。线程和数据同步并且需要锁数据以保证这段时间数据只被这一人使用,让数据是安全的。
官话:(所谓同步,就是发出一个功能调用时,在没有得到结果之前,该调用就不返回或继续执行后续操作。根据这个定义,Java中所有方法都是同步调用,因为必须要等到结果后才会继续执行。我们在说同步、异步的时候,一般而言是特指那些需要其他端协作或者需要一定时间完成的任务。 简单来说,同步就是必须一件一件事做,等前一件做完了才能做下一件事。)
    特点:数据安全,但效率低。

   加锁机制:同步锁:Lock lock = new ReentrantLock(); re entrant lock
   同步代码块synchronized:在同步代码块之内,确保了这个线程只能被一个用户访问
   线程唤醒notify唤醒一条线程  notifyall唤醒所有
   线程等待wait----轮询( 1进入同步代码块之后唤醒2(all- 唤醒其他所有人)排队等待 1 完成任务,等1完成任务之后2进入(或是其他所有人抢进入),此时1排到队伍最后去了)

wait 和sleep的区别
wait 会释放cpu让其他线程来执行,notify可以唤醒所有线程。sleep不会释放cpu

2、异步Async:外卖下单,买的是订单,一群人谁都可以访问这个链接,叫并发。list set
官话:(异步与同步相对,当一个异步过程调用发出后,调用者在没有得到结果之前,就可以继续执行后续操作。当这个调用完成后,一般通过状态、通知和回调来通知调用者。对于异步调用,调用的返回并不受调用者控制。)
    特点:不保证线程同步,可以随时访问,速度快。

今日代码:package:Sync、 ThreadDemo

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值