自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(60)
  • 资源 (1)
  • 收藏
  • 关注

原创 FutureTask源码解析

我们在讲源码之前先来一点最基本的应用吧,然后再慢慢的深入。public class FutureExample1 { static class MyCallable implements Callable<String>{ @Override public String call() throws Exception { ...

2020-03-17 22:51:35 453

原创 ThreadPoolExecutor源码解析

在Java中,如果每个请求到来我们就创建一个新的线程,创建和销毁线程花费的时间和消耗的系统资源都非常之大,甚至有可能比在处理实际的用户请求所使用的资源还要多。如果在一个jvm里面创建太多的线程,那么可能会使得系统由于过度消耗内存或者频繁切换线程而导致系统资源不足。所以这时有了线程池这个概念,非常好的解决了上面两个问题。另外线程池也提供了许多可调参数和可扩展性接口,以满足不同的情景需求。程序...

2020-03-08 14:18:57 411

原创 ThreadLocal

1、为什么有ThreadLocal 多线程并发访问同一个共享变量的时候特别容易出现问题,为了保证线程安全,一般我们都要在访问共享变量的时候进行适当的同步,同步的措施一般就是可以加锁,但是呢加锁的话需要我们使用者对锁有一定的了解,而且加锁的话某一时刻只能有一个线程能够访问到共享变量,其他线程都会被阻塞挂起,影响了性能。那么是否有一种方式可以做到,创建一个变量A之后每个线程都能将其复制...

2020-02-09 23:46:25 265

原创 理解多线程join、sleep、yield、interrupt方法

一、join方法 在项目中我...

2020-02-05 12:24:33 394

原创 线程创建与运行、通知与等待

一、Java中有三种线程创建方式,分别为实现Runnable接口的run方法,继承Thread类并重写run方法,使用了FutureTask方式。1、Thread:创建完thread对象后该线程并没有被启动执行,直到调用了start方法后才真正启动了线程。其实调用start方法后线程并没有马上启动,而是处于就绪状态,这个就绪状态 是指该线程已经获取了除CPU资源外的其他资源,等待获取CPU资源...

2020-02-04 00:31:44 231

原创 什么是线程

1、什么是线程?进程是代码在数据集合上的一次运行活动,是操作系统进行资源分配和调度的基本单位,也就是说一个应用程序就是一个进程,一个进程中至少有一个线程,进程中的多个线程共享进程的资源。同理的多线程存在于一个应用程序中,让一个应用程序中可以有多个执行部分同时运行,但是操作系统不会把多个线程认为是多个应用,它只会对进程进行资源分配和调度。而线程的调度是由进程完成的。也就是操作系统可以同时运行多个...

2020-02-02 17:11:31 279

原创 Spring xml文件xmlns和xsi的意思

了解xml文件的同学应该都知道xml文件的验证模式保证了xml文件格式的正确性,主要的验证模式有DTD以及XSD。不过现在spring比较常用到的是xsd。以下面的例子进行一个分析:<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/200...

2019-11-03 14:52:40 782

原创 servlet容器与Apache容器的区别

我一直很迷惑Tomcat和Apache之间的关系,百度了一下,做了一下总结:两者的定位:Apache是HTTP Web服务器,Tomcat是Web服务器两者的区别:1、Apache是世界上最流行的Web服务器(其次是微软的IIS),可以处理HTTP请求,默认端口是80;Tomcat是运行在Apache上的应用服务器,它是一个Servlet容器,也可以单独运行的。2、Apache只能...

2019-08-04 16:06:22 476

转载 form表单提交与ajax提交的差别

第一种:表单提交Form Submit方式Form提交是我们经常使用的向后台提交数据的一种方式<form action="form_action.asp" method="get" onsubmit=""> <p>First name: <input type="text" name="fname" /></p> <p&...

2019-04-20 15:34:15 1495

转载 String 和 new String的区别

String str1 = "ABC";String str2 = new String("ABC");String str1 = "ABC" 可能创建一个对象可能没有创建对象,如果“ABC”这个字符串在java String池中已经存在,那么就不用创建了,直接把str1指向这个内存地址。若是不存在则要java String 池中创建一个"ABC"的对象。之后无论创建多少个对象,若是存在了...

2019-04-07 10:50:59 146

转载 java中jvm的重排序

刚刚在研究volatile变量的时候,涉及到重排序的概念,于是发现了这篇很好的文章,写得很简短很明白。所以转载一下。原文地址:JAVA中JVM的重排序详细介绍原文贴出来:重排序通常是编译器或运行时环境为了优化程序性能而采取的对指令进行重新排序执行的一种手段。重排序分为两类:编译期重排序和运行期重排序,分别对应编译时和运行时环境。在并发程序中,程序员会特别关注不同进程或线程之间...

2019-03-28 23:23:44 153

转载 何谓悲观锁和乐观锁

何谓悲观锁与乐观锁 乐观锁对应于生活中乐观的人总是想着事情往好的方向发展,悲观锁对应于生活中悲观的人总是想着事情往坏的方向发展。这两种人各有优缺点,不能不以场景而定说一种人好于另外一种人。悲观锁总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁(共享资源每次只给一个线程使用,其它线程阻塞,用完后再...

2019-03-28 23:21:52 125

原创 springmvc之静态资源处理(三)

如果我们想访问index.html,然后url-pattern中的路径设置为'/',你会发觉一直访问不了,这是为什么呢?我们可以分析一下原因。在tomcat中也有内置的servlet,比如说一些数据的回显啊,是怎么样把我们封装的Java对象放在jsp页面进行回显,都是由tomcat的servlet做的,同理的我们想访问一个静态资源,tomcat也有对应的servlet(default)为我们做...

2019-03-24 18:26:03 114

原创 springmvc之第一个程序(二)

写第一个程序的步骤:1、需要在web.xml中配置请求分发器DispatcherServlet,contextConfigLocation定义在哪个地方来配置这些属性值,这个属性是DispatcherServlet下的一个变量来着。接着这个配置里面还有一个load-on-startup,这是启动优先级。设置了1的话会在服务器启动的时候就去加载这个servlet,而不会在访问的时候再去加载,这样...

2019-03-24 18:13:56 145

原创 springmvc之mvc模式简介(一)

一直写着springmvc的代码,但是没有对它进行一个总结,静下心来查查资料,并且想总结下来加深一下印象。 mvc的全名就是Model View Controller,是模型--视图--控制器的缩写,是一种设计典范。它是将业务逻辑、数据、与界面显示的代码分离开来,更好的管理代码。 那在mvc模式出现以前是什么的一种情况呢?什么代码都可以写在jsp里面,因为jsp...

2019-03-24 15:17:29 3655

原创 IDEA编译后没有找到mapper.xml文件

org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)idea编译mapper之后总是报说没有找到该方法。检查了好多变接口名字或者函数名就是没发觉有错误,后来才查到原来Idea默认不编译 src\main\java下的xml文件的,所以如果是使用mybatis,有两个方案:1、把mapp...

2019-03-18 21:20:28 3776 2

原创 idea使用maven创建项目

使用maven创建项目,并且使用maven自带的tomcat插件1、创建maven项目,并选择 maven-archetype-webapp2、填写groupId以及ArtifactId3、这里设置maven仓库,通过修改settings.xml文件的位置问题,最好该配置文件是加上阿里巴巴的仓库,在下载依赖包的时候会更加的快:&lt;mirror&gt; ...

2019-03-11 21:35:29 167

原创 idea使用war以及war exploded的区别

war:先打包成war包,再把该war包部署到服务器上war exploded:直接把文件夹、class文件等等移到Tomcat上进行部署。因此这种方式支持热部署,一般在开发的时候都是使用这种模式。war exploded模式:1、new Project然后创建web application项目2、填写项目名称3、在WEB-INF文件夹下新建两个目录lib、classes。...

2019-03-11 00:13:33 14855

原创 JDBC基础2之DAO

在说DAO之前我们首先讲一下结果集,前面提到的都是DML的操作也就是(增删改),而当我们查询操作将会返回很多数据表格,这时我们应该用结果集来接收返回的数据Statement接口中有个方法:ResultSet executeQuery(String sql);//执行DQL操作ResultSet 接口:查询的结果boolean next():试图把光标往下移动一行,移动成功后返回true

2017-10-09 16:45:42 265

原创 java之反射

当程序第一次使用某一个java.util.Date类的时候,就会把该类的字节码对象加载进JVM,并创建出一个class对象,此时class对象就表示java.util.Date的字节码。Class类可以表示N个类的字节码对象,问题是怎么区分Class类此时表示的哪一个类的字节码呢?Class类的设计者提供了泛型Classjava.lang.String类的字节码类型:classjava

2017-09-20 16:23:34 290 1

原创 java之类加载

讲反射之前我们先讲下JVM和类:在代码编译后,就会生成JVM(JAVA虚拟机)能够识别的二进制字节流文件(*.class)。而JVM把Class文件中的数据从文件加载到内存,并对数据进行校验,转换解析,初始化,使这些数据最终成为可以被JVM直接使用的JAVA类型,这过程就是JVM的类加载机制。Java的执行过程就是JVM从启动到退出的过程。当调用java命令来运行某个java程序时,该

2017-09-20 10:57:27 301

原创 JDBC基础1

Driver 接口 java.sql.driverDriver 类    com.mysql.jdbc.DriverDriverManger类 registerDriver(Driver driver) 方法(注册驱动)1. 加载注册驱动class.forName("com.mysql.jdbc.Driver");(1)在classpath加载com.mysql,jdb

2017-09-16 13:34:34 272

原创 为什么在导进jar包之后要进行add to build path???

其实导进jar包主要的步骤就是add to build path。而不是把你的jar包放在lib目录下。首先我们先解释一下jar包放在lib目录下的作用是什么?先用一个实例,假如我现在有一个项目,我用到了一个叫hello.jar的jar包,这个jar包在存放我的c盘根目录下,当我点击add to build path时候,引用的路径就为:“C:/hello.jar”。当我把这个项目

2017-09-15 15:06:52 14782 2

原创 系统编程七

这一节主要是讲有名管道有名管道的特点是它保证了写入原子性,而且可用于无亲缘关系的任意进程,它是创建在某个路径下,所以当进程退出时它也不会消失,而无名管道是创建在内存中,所以进程退出时候它就消失了。进程利用有名管道通信需要用到双线程,一个线程用于读,一个线程用于写。下图是有名管道与无名管道的区别:程序://写进程#define FIFONAME "myfifo"#de

2017-05-16 11:10:49 203

原创 系统编程六

主要是讲进程之间的通信传统的进程间通信:无名管道(pipe) 有名管道(fifo) 信号(signal)System v ipc对象:共享内存 消息队列 信号量 POSIX信号量(无名、有名)BSD:套接字(主机与主机之间)管道有三种:无名管道(pipe) 、有名管道(fifo) 、套接字无名管道:用于一对一,而且要亲缘关系,而且数据量少。P1进程把数据通过管道

2017-05-15 23:50:51 190

原创 系统编程五

对话期:用secucrt软件远程登录一个用户的时候,就是创建了一个对话期(session)。对话期和进程组都是为了方便给进程发信号而存在的。./test 是在前台进程组运行./test &是在后台进程组运行精灵进程是就算关闭终端了,它还在运行。。只要主机不断电。他是在一个独立的空间默默的运行。下面说一下创建精灵进程的步骤:最先运行在前台组的程序是

2017-05-15 22:37:22 207

原创 系统编程四

exec函数以及wait函数(1)exec实际上,在linux中并没有exec函数,而是有6个以上的exec开头的函数族。原型:int execl(const char *path, const char *arg, ...)int execv(const char *path, char *const argv[])in

2017-05-15 19:56:29 247

原创 系统编程三

进程的创建和退出(1) fork函数原型 pid_t fork(void);头文件:#include 说明:该函数执行成功之后,将会产生一个新的子进程,在新的子进程中其返回值为 0,在原来的父进程中其返回值为大于 0 的正整数,该正整数就是子进程的 PID。程序:int main(int argc, char **argv){printf("[%d]\n", __L

2017-05-15 16:16:10 229

原创 系统编程二

进程状态转换父进程通过一个fork()可以生出一个子进程,此时是就绪状态(task_running),它是在等待cpu的调度(schedule),如果它被CPU调度了,就会变成执行态(task_running)。如果此时需要等待资源(好比是排队排到你了,但你忘记带钱了),就进入睡眠状态,可分为浅度睡眠和深度睡眠。浅的可以被信号中断唤醒,深的不行,浅的一般都是等待一个软件信号,深的都是硬件信号,

2017-05-12 11:38:32 210

原创 系统编程一

进程是一个程序的一次执行的过程。进程和程序的区别:程序是静态的,它是一些保存在磁盘上的指令的有序集合,没有任何执行的概念。进程是一个动态的概念,它是程序执行的过程,包括创建、调度和消亡。进程是资源管理的最小单位。线程是系统调度的最小单位。task_struct在内核中称之为任务,cpu是调度它。进程包含指令和用户数据,当执行一个程序时,系统将程序中的指令和数

2017-05-12 10:24:37 294

原创 文件IO编程十二

windows目录是是一个容器,是在分区下的,也是一个文件夹而linux下目录是一个路径,是供分区挂载的,用户通过这个路径才可以找到分区。  i_node是描写文件的属性。dir/是文件名以及索引名。我们在操作文件的时候,经常需要获取文件的属性,比如类型、权限、大小、所有者等等。头文件:#include  #include #include 原型:int

2017-05-11 21:47:13 240

原创 文件IO编程十一

这一节主要是讲缓冲类型。根据不同的刷新时间可分为不同的缓冲类型:不缓冲、全缓冲、行缓冲。标准输出stdout是行缓冲,stderr是不缓冲。普通文件打开都是全缓冲不缓冲====================一旦遇到数据全缓冲:=====================1 填满了缓冲区2 fflush() 强制刷新3 fclose()调用fflush()

2017-05-11 17:13:59 190

原创 文件IO编程十

(1) fgets 详解函数:char *fgets(char *s, int size, FILE *stream);说明:fgets()用来从参数stream所指的文件内读入字符并存到参数s所指的内存空间,直到出现换行字符,读到文件尾或是已读了size-1个字符为止,最后会加上NULL作为字符串结束。 若成功则返回s指针,返回NULL则失败。(2) fputs详解函数:

2017-05-11 14:49:37 210

原创 文件IO编程九

(1) fgetc/getc/getchar 详解函数:int fgetc(FILE *stream);说明:fgetc()从参数stream所指的文件中读取一个字符,若读到文件尾而无数据时则返回EOF。正常情况下是返回该值函数:int getc(FILE *stream);说明:与fgetc()的区别就是fgetc()是函数调用,而getc()是宏,它会相对比较快速。但是普通

2017-05-11 11:51:17 204

原创 文件IO编程八

这一节主要是讲标准IO标准IO的操作对象是文件指针,FILE *。而且标准IO是有缓冲区的。stdout是行缓冲。这个文件指针则是由fopen()函数获取的。(1)  fopenFILE *fopen(const char *path, const char *mode);头文件 #include path:要打开的文件。mode: “r”:  以只读方式打

2017-05-10 23:56:19 172

原创 文件IO编程七

这一节主要是讲mmap()和错误码的处理mmap函数mmap()函数在进程的虚拟内存空间中映射出一块内存区域,用以对应指定的一个文件,该内存区域上的数据对应的文件的数据是一一对应的,并在一开始的时候用文件的内容来初始化这片内存。void *mmap(void *addr, size_t length,int prot, int flags, int fd, off_t offs

2017-05-10 17:59:31 278

原创 文件IO编程六

这一节继续讲解系统IO函数(1) dup头文件:#include 定义函数:int dup (int oldfd);说明:dup()用来复制参数oldfd所指向的文件描述符,此时返回的新的文件描述符和参数oldfd所指的是同一个文件,共享所有的锁定、读写位置和各项权限或旗标。例如,当利用lseek()对某个文件描述符作用时,另一个文件描述符的读写位置也会随着改变。

2017-05-10 16:21:45 205

原创 文件IO编程五

这一节主要是将系统IO的四个函数:read write(1)read头文件:#include ssize_t read(int fd, void * buf, size_t count);说明:read是把参数fd所指的文件传送count个字节到buf指针所指的内存中去。若参数count为0,则read()不会有作用并返回0。返回值为实际读取的字节数,若返回0.表示已经读取完成

2017-05-09 23:32:45 232

原创 文件IO编程四

这一节主要将系统IO的特点以及处理文件的函数。首先介绍以下linux下的七种文件系统:1.d 目录2.- 普通文件3.c 字符设备4.b 块设备5.l 符号链接文件6.s 本地套接字7.p 管道文件文件描述符是什么意思呢?一个txt文件读到哪了,或者它是以什么模式打开的等等信息都记录在file这个结构体中,一个file结构体只能记录一个文件的信息

2017-05-09 16:30:50 287

原创 文件IO编程三

这一节主要是讲系统IO和标准IO的区别。在VFS虚拟文件系统的上层有个系统调用API,系统I/O有一部分是操作文件IO,而标准IO是封装过的,它最终也会调用系统IO。区别:1. 系统IO是操作文件描述符(整数),而标准IO是操作文件指针。2. 系统IO比较耗时,所以标准IO是有个缓冲区buffer的,只有达到某一个阙值,它才会去调用系统IO,这样比较省时。

2017-05-09 15:22:04 329

DHT11传感器

DHT11传感器在51单片机的C语言程序

2015-05-12

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除