线程阻塞

进程与线程(一)(基本定义和demo)

≡放荡痞女 提交于 2020-03-19 07:26:32
线程和进程 进程定义 进程指正在运行的程序 确切的来说,当一个程序进入内存运行,即变成一个进程,进程是处于运行过程中的程序,并且具有一定独立功能。(比如电脑中运行的酷狗,qq等) 线程定义 线程是进程中的一个执行单元,负责当前进程中程序的执行,线程共享进程的资源。 线程与进程的关系 一个程序运行后至少有一个进程,一个进程中可以包含多个线程。 主线程 jvm启动后,必然有一个执行路径(线程)从main方法开始的,一直执行到main方法结束,这个线程在java中称之为主线程。 多线程定义 即就是一个程序中有多个线程在同时执行。多线程程序并不能提高程序的运行速度,但能够提高程序运行效率,让CPU的使用率更高。提到多线程就要提到两个概念:串行/并行 串行 单个线程执行多个任务。比如下载文件,第一个没下完不能开始下载第二个,属于不同时刻。缺点很明显,效率很低。 并行 多个线程执行多个任务。比如开启迅雷同时下载好几个文件,属于同一时刻。效率很高,但是要注意不要每个任务都建一个线程去处理,任务数量越多,内存压力越大,严重会导致宕机。 程序运行原理 分时调度 所有线程轮流使用CPU的使用权,平均分配每个线程占用CPU的时间。 抢占式调度 优先让优先级高的线程使用CPU,如果线程的优先级相同,那么会随机选择一个线程(线程随机性),java使用的为抢占式调度。 使用线程和不适用线程的区别

I/O 模型

余生长醉 提交于 2020-03-19 02:40:20
2018-01-29 一、基本概念: 同步与异步 区别:多个任务和事件发生时,一个事件的发生或执行是否会导致整个流程的暂时等待。 阻塞与非阻塞: 区别:当发出请求一个操作时,如果条件不满足,是会一直等待还是返回一个标志信息 阻塞IO:当用户线程发出IO请求之后,内核会去查看数据是否就绪,如果没有就绪就会等待数据就绪,而用户线程就会处于阻塞状态,用户线程交出CPU。当数据就绪之后,内核会将数据拷贝到用户线程,并返回结果给用户线程,用户线程才解除block状态。 非阻塞IO: 当用户线程发起一个read操作后,它马上就得到了一个结果。如果结果是一个error时,它就知道数据还没有准备好,于是它可以再次发送read操作。一旦内核中的数据准备好了,并且又再次收到了用户线程的请求,那么它马上就将数据拷贝到了用户线程,然后返回。 所以在非阻塞IO模型中,用户线程需要不断地询问内核数据是否就绪,也就说非阻塞IO不会交出CPU,而会一直占用CPU。 同步IO 与 异步IO 区别:同步IO和异步IO的关键区别反映在数据拷贝阶段是由用户线程完成还是内核完成。所以说异步IO必须要有操作系统的底层支持。 同步io:如果数据没有就绪,需要通过用户线程或者内核不断地去轮询数据是否就绪,当数据就绪时,再将数据从内核拷贝到用户线程。 异步io:IO操作的两个阶段都是由内核自动完成

浅谈I/O模型

…衆ロ難τιáo~ 提交于 2020-03-19 02:40:01
在学习线程,NIO等知识时都需要知道一些基础知识。 一、什么是同步或异步 同步:个人通俗理解多个人排队打饭一个窗口,只有前面一个人打完了,后面的人才能打。如果前面人因为什么原因一直站在那里不走,后面的人就一直需要等待。 如果有多个任务或事件要发生,多个任务或事件要逐个去执行,如果其中有一个事件或任务出现问题都会影响整个流程,其他任务都需要进行等待 异步:多个人排队打发多个窗口,每个人选择一个窗口不需要等待,一个人出现窗口占用,其他人不受影响。 多个任务或事件并发执行,一个任务或事件不会影响整个流程的暂时等待 示例1 典型的同步操作 方法在调用是从上到下依次执行, 只有fun1执行完成后,fun2才会被执行 void fun1(){ } void fun2(){ } main(){   fun1(); fun2(); } 示例2 主线程开启两个子线程 两个子线程调用互不影响 两个方法的调用也互不影响 fun1() 与 fun2()之间不需要等待 fun1(){} fun2(){} main(){   new Thread(){ public void run(){    fun1();  } }.start();    new Thread(){ public void run(){    fun2();  } }.start();     } 二、什么是阻塞 和非阻塞 阻塞

Java I/O模型的简单说明

∥☆過路亽.° 提交于 2020-03-19 02:39:21
  1、同步和异步   同步:如果有多个任务或者事件要发生,这些任务或者事件必须逐个地进行,一个事件或者任务的执行会导致整个流程的暂时等待,这些事件没有办法并发地执行,最简单的例子就是顺序的执行两个方法,当第一个方法正在执行时,那么第二个方法需要等待第一个方法执行完毕后才能继续执行   异步:如果有多个任务或者事件发生,这些事件可以并发地执行,一个事件或者任务的执行不会导致整个流程的暂时等待,在Java中最常见的就是多线程来实现异步,执行一个方法的同时,开另外一个线程同时执行其他事情   2、阻塞和非阻塞   阻塞:当某个事件或者任务在执行过程中,它发出一个请求操作,但是由于该请求操作需要的条件不满足,那么就会一直在那等待,直至条件满足,比如实现一个功能是读取指定目录下的文件的内容,如果文件不存在,那么程序将无限循环的进行读取,比如每隔3s继续读一次,就好像服务器一样一直在后台以服务形式运行着   非阻塞:当某个事件或者任务在执行过程中,它发出一个请求操作,如果该请求操作需要的条件不满足,会立即返回一个标志信息告知条件不满足,不会一直在那等待,比如也是读取一个目录下指定文件,如果文件读取到,则返回文件的内容给程序,如果不存在则返回相应的状态,这段程序到这里就执行完毕了   同步、异步和阻塞、非阻塞之间没有必然联系,更不能划等号,   3、阻塞IO和非阻塞IO  

Java NIO1:I/O模型概述

僤鯓⒐⒋嵵緔 提交于 2020-03-19 02:34:41
I/O模型 在开始NIO的学习之前,先对I/O的模型有一个理解,这对NIO的学习是绝对有好处的。我画一张图,简单表示一下数据从外部磁盘向运行中进程的内存区域移动的过程: 这张图片明显忽略了很多细节,只涉及了基本操作,下面分析一下这张图。 用户空间和内核空间 一个计算机通常有一定大小的内存空间,如一台计算机有4GB的地址空间,但是程序并不能完全使用这些地址空间,因为这些地址空间是被划分为用户空间和内核空间的。 程序只能使用用户空间的内存 ,这里所说的使用是指程序能够申请的内存空间,并不是真正访问的地址空间。下面看下什么是用户空间和内核空间: 1、用户空间 用户空间是常规进程所在的区域,什么是常规进程,打开任务管理器看到的就是常规进程: JVM就是常规进程,驻守于用户空间,用户空间是非特权区域,比如在该区域执行的代码不能直接访问硬件设备。 2、内核空间 内核空间主要是指操作系统运行时所使用的用于程序调度、虚拟内存的使用或者连接硬件资源等的程序逻辑。内核代码有特别的权利,比如它能与设备控制器通讯,控制着整个用于区域进程的运行状态。和I/O相关的一点是: 所有I/O都直接或间接通过内核空间 。 那么,为什么要划分用户空间和内核空间呢?这也是为了保证操作系统的稳定性和安全性。用户程序不可以直接访问硬件资源,如果用户程序需要访问硬件资源,必须调用操作系统提供的接口

Java NIO:浅析I/O模型

ぃ、小莉子 提交于 2020-03-19 02:33:30
以下是本文的目录大纲:   一.什么是同步?什么是异步?   二.什么是阻塞?什么是非阻塞?   三.什么是阻塞IO?什么是非阻塞IO?   四.什么是同步IO?什么是异步IO?   五.五种IO模型   六.两种高性能IO设计模式 一.什么是同步?什么是异步?   同步和异步的概念出来已经很久了,网上有关同步和异步的说法也有很多。以下是我个人的理解:   同步就是:如果有多个任务或者事件要发生,这些任务或者事件必须逐个地进行,一个事件或者任务的执行会导致整个流程的暂时等待,这些事件没有办法并发地执行;   异步就是:如果有多个任务或者事件发生,这些事件可以并发地执行,一个事件或者任务的执行不会导致整个流程的暂时等待。   这就是同步和异步。举个简单的例子,假如有一个任务包括两个子任务A和B,对于同步来说,当A在执行的过程中,B只有等待,直至A执行完毕,B才能执行;而对于异步就是A和B可以并发地执行,B不必等待A执行完毕之后再执行,这样就不会由于A的执行导致整个任务的暂时等待。   如果还不理解,可以先看下面这2段代码: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 void fun1() { } void fun2() { } void function(){ fun1(); fun2() ..... ..... }   这段代码就是典型的同步

Java NIO:浅析I/O模型

烈酒焚心 提交于 2020-03-19 02:32:43
转载: Java NIO:浅析I/O模型 一.什么是同步?什么是异步?   同步和异步的概念出来已经很久了,网上有关同步和异步的说法也有很多。以下是我个人的理解:   同步就是:如果有多个任务或者事件要发生,这些任务或者事件必须逐个地进行,一个事件或者任务的执行会导致整个流程的暂时等待,这些事件没有办法并发地执行;   异步就是:如果有多个任务或者事件发生,这些事件可以并发地执行,一个事件或者任务的执行不会导致整个流程的暂时等待。   这就是同步和异步。举个简单的例子,假如有一个任务包括两个子任务A和B,对于同步来说,当A在执行的过程中,B只有等待,直至A执行完毕,B才能执行;而对于异步就是A和B可以并发地执行,B不必等待A执行完毕之后再执行,这样就不会由于A的执行导致整个任务的暂时等待。   如果还不理解,可以先看下面这2段代码: void fun1() { } void fun2() { } void function(){ fun1(); fun2() ..... ..... }   这段代码就是典型的同步,在方法function中,fun1在执行的过程中会导致后续的fun2无法执行,fun2必须等待fun1执行完毕才可以执行。   接着看下面这段代码: void fun1() { } void fun2() { } void function(){ new Thread()

Java NIO:浅析I/O模型

試著忘記壹切 提交于 2020-03-19 02:31:59
学习Java的同学注意了!!! 学习过程中遇到什么问题或者想获取学习资源的话,欢迎加入Java学习交流群:618528494 我们一起学Java!   也许很多朋友在学习NIO的时候都会感觉有点吃力,对里面的很多概念都感觉不是那么明朗。在进入Java NIO编程之前,我们今天先来讨论一些比较基础的知识:I/O模型。下面本文先从同步和异步的概念 说起,然后接着阐述了阻塞和非阻塞的区别,接着介绍了阻塞IO和非阻塞IO的区别,然后介绍了同步IO和异步IO的区别,接下来介绍了5种IO模型,最后介绍了两种和高性能IO设计相关的设计模式(Reactor和Proactor)。   以下是本文的目录大纲:   一.什么是同步?什么是异步?   二.什么是阻塞?什么是非阻塞?   三.什么是阻塞IO?什么是非阻塞IO?   四.什么是同步IO?什么是异步IO?   五.五种IO模型   六.两种高性能IO设计模式   若有不正之处,请多多谅解并欢迎批评指正。 一.什么是同步?什么是异步?   同步和异步的概念出来已经很久了,网上有关同步和异步的说法也有很多。以下是我个人的理解:   同步就是:如果有多个任务或者事件要发生,这些任务或者事件必须逐个地进行,一个事件或者任务的执行会导致整个流程的暂时等待,这些事件没有办法并发地执行;   异步就是:如果有多个任务或者事件发生,这些事件可以并发地执行

1.python进程、线程、多线程

无人久伴 提交于 2020-03-18 22:01:05
2018-07-16 1. 进程 简单理解 :进程就是一段程序执行的过程。 广义理解 :进程就是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。 进程是 cpu调度 和分配的基本的分配单元,也是基本的执行单元。 进程的状态: 就绪 : 获取cpu外的所有资源,只要分配资源就可以马上执行。        运行 : 获得了分配的资源,程序开始执行。        阻塞 : 条件不满足时,等待满足时才执行。 一个进程在运行期间,不断地从一种状态转换到另一种状态,它可以多次处于就绪状态和执行状态,也可以多次处于阻塞状态。 1.就绪→执行 处于就绪状态的进程,当进程调度程序为之分配了处理机后,该进程便由就绪状态转变成执行状态。 2. 执行→就绪 处于执行状态的进程在其执行过程中,因分配给它的一个时间片已用完而不得不让出处理机,于是进程从执行状态转变成就绪状态。 3. 执行→阻塞 正在执行的进程因等待某种事件发生而无法继续执行时,便从执行状态变成阻塞状态。 4. 阻塞→就绪 处于阻塞状态的进程,若其等待的事件已经发生,于是进程由阻塞状态转变为就绪状态。 2. 线程 理解:一个进程可以包含若干个进程,一个进程至少有一个线程。线程可以利用进程所拥有的资源,在引入线程的操作系统中,把进程作为分配资源的基本单位,线程作为独立运行和调度的基本单位,相比进程而言线程调度资源消耗小

5.线程的八大核心基础知识之Thread和Object类中的重要方法详解

那年仲夏 提交于 2020-03-18 18:14:17
一.概述 二.方法概览 三.wait,notify,notifyAll方法详解 1.作用和用法:阻塞阶段、唤醒阶段、遇到中断 wait作用是释放锁,当前线程进入等待, notify和notifyAll作用是通知等待线程可以执行 wait,notify,notifyAll都必须放到同步代码块中 (1)wait和notify基本用法展示: 首先thread1线程拿到object对象锁住object后执行进入到wait方法后释放了锁,进入了等待状态 然后thread2线程拿到object对象锁住object后执行notify通知等待的线程可以运行了,然后继续执行run方法到结束 最后thread1拿到锁继续执行run方法到结束 /** * 展示wait和notify的基本用法:1.研究代码执行顺序 2.证明wait释放锁 */ public class Wait { public static Object object = new Object(); static class Thread1 extends Thread{ @Override public void run() { synchronized (object){ System.out.println(Thread.currentThread().getName() + "开始执行了"); try { object