梳理并发和并行并发在操作系统中,指的是一段时间内有几个程序在开始运行和运行到完成之间,而这些程序是全部同时运行。在一个处理器上运行。并行当系统有多个CPU时,当一个CPU执行一个进程时,另一个CPU可以执行另一个进程,两个进程不互相抢占CPU资源,可以同时执行。这种方法称为并行(Parallel)。ProcessThreadFiberProcess进程是计算机中正在运行的程序的实体。线程线程是操作系统能够进行操作调度的最小单位。它包含在流程中,是流程中的实际操作单元。线程是指进程中的单个顺序控制流。多个线程可以在一个进程中并发运行,每个线程并行执行不同的任务。以上内容摘自维基百科。从上面的描述来看,进程本质上就是一个程序的运行状态;线程是进程中的不同执行路径。从更专业的角度来说,进程本质上是操作系统分配资源的基本单位;协程是执行调度的基本单元。(分配资源就像你打开一个程序,操作系统在内存中划分一块区域给你加载你的程序)。每个进程之间的内存空间是独立的,每个进程中的线程共享内存空间,没有自己独立的内存空间。这是进程和线程之间的主要区别。什么是纤维?Fibers其实可以理解为threadsofthreads。系统在执行调度的时候,是以线程为基本单位的,这是不可控的,但是我们也需要按照一定的顺序执行。这时候就需要用到锁来解决了。光纤调度完全由用户控制。fiber也可以理解为用户态的线程,不涉及用户态和内核态的切换。因为不需要操作系统的切换和调度,所以一定是最快的。纤程占用的资源也比线程少。一个线程占用的资源大约是4k,而一个线程是1M。目前支持内置纤程的语言:GoScalaKotlinPython(需要第三方库)线程状态线程分为6种状态,分别为:NEW(创建)RUNNABLE(可运行)READY(就绪)RUNNING(运行)BLOCK(阻塞)WAITING(无限期等待)TIMEWAITING(有限时间等待)TERMINATE(终止)下图描述了线程状态的切换。阻塞和等待的区别在于,阻塞是被动的,线程在等待被其他线程抢先占用。监听锁,所以被屏蔽了;whilewaiting就是主动调用方法进入等待状态。使用线程创建线程创建线程,那么如何创建线程呢?在Java中有3种创建线程的方法。继承Thread类publicclassMyThreadextendsThread{publicvoidrun(){//...}}实现Runnable接口publicclassMyRunnableimplementsRunnable{@Overridepublicvoidrun(){//...}}线程池publicstaticvoidmain(String[]args){Executors.newCachedThreadPool();//创建一个线程池,该线程池根据需要创建新线程,但会在它们可用时重用以前构造的线程。Executors.newFixedThreadPool(10);//创建一个线程池,重复使用固定数量的线程运行在一个共享的无界队列上。Executors.newSingleThreadExecutor();//为单线程创建线程池,相当于newFixedThreadPool(1);Executors.newScheduledThreadPool(2);//创建一个线程池,可以安排命令在给定的延迟后运行或定期执行。Executors.newSingleThreadScheduledExecutor();//创建一个单线程执行器,它可以安排命令在给定的延迟后或定期运行。}线程方法sleepsleep是睡眠的意思,所以sleep就是当前线程暂停一段时间,让其他线程执行。具体时间取决于你的参数设置。@Overridepublicvoidrun(){尝试{Thread.sleep(200);}catch(InterruptedExceptione){e.printStackTrace();}}yieldyield有放弃的解释,所以yield的意思是当当前线程正在执行时放弃,继续执行,回到等待队列,等待系统的下一次调度。@Overridepublicvoidrun(){Thread.yield();}joinjoin的意思是加入,thenjoin的意思是当当前线程调用另一个线程的join方法时,会挂起当前线程,让另一个线程执行完。当前线程继续执行。Threadt1=newThread(()->{for(inti=0;i<5;i++){System.out.println("t1:"+i);尝试{TimeUnit.SECONDS.sleep(1);}catch(InterruptedExceptione){e.printStackTrace();}}});Threadt2=newThread(()->{try{t1.join();}catch(InterruptedExceptione){e.printStackTrace();}for(inti=0;i<5;i++){System.out.println("t2:"+i);try{TimeUnit.SECONDS.sleep(1);}catch(InterruptedExceptione){e.printStackTrace();}}});t1.start();t2.start();参考链接ProcessThreadCoroutineCS-Notes/JavaConcurrencyJava工程师神之路
