0%

前面的文章讲解了分支的操作和原理,接下来接着看一下git的checkout、stash、blame、diff等命令的一些使用方法。

git checkout

修改一下文件,看看git status会提示什么?

1
2
3
4
5
6
7
8
9
10
➜  mygit git:(master) vim test.txt 
➜ mygit git:(master) ✗ git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)

modified: test.txt

no changes added to commit (use "git add" and/or "git commit -a")

Git提示到:修改没有暂存,请用git add或者git checkout --,我们试一下

1
➜  mygit git:(master) ✗ git checkout -- test.txt
阅读全文 »

随着多核处理器的出现,提升应用程序处理速度最有效的方式是编写能充分发挥多核能力的软件。可以通过切分大型的任务,让每个子任务并行运行,在Java中目前有直接使用线程的方式、使用Fork/Join框架和JDK8中的并行流来达到这一目的。

这段代码演示了分段求和用线程方式的实现。

分别开启2个线程,给予不同范围的数值进行求和,最后调用join()方法等到线程执行完毕,将2个线程的结果相加得到结果。

阅读全文 »

源码分析(二)

在理解了Reactor模式后,因为Netty框架本身就是基于Reactor模式的一种实现,所以回过头来再看源码,才能更好的理解代码中一些类的角色和意义。

ServerBootStrap在调用bind()方法后,通过channelFactory反射的方式创建了我们指定的Channel(**NioServerSocketChannel.class**)对象,然后调用了init(channel)方法对channel进行了初始化设置。

看一下ServerBootStrap.init()**,初始化Channel的代码,ChannelPipeline p = channel.pipeline();这里面就出现了一个Netty中一个又一个非常核心的类ChannelPipeline,它是在Channel的父类AbstractChannel**初始化的时候创建的。

ChannelPipeline

ChannelPipeline里面是一个一个的ChannelHandler,当客户端的请求到来或者出去的的时候,会一个一个的通过这些处理器,就像一个过滤器一样。每一个Channel都拥有自己的ChannelPipeline,当一个Channel被创建的时候,ChannelPipeline也跟着被创建了。I/O事件只能被ChannelInboundHandler和ChannelOutboundHandler其中之一所处理,处理完成后再传递到别的处理器中(ChannelHandlerContext#fireChannelRead(Object)或者ChannelHandlerContext#write(Object))。

阅读全文 »

先介绍一下**.gitignore**

.gitignore

项目里面经常有一些文件是不需要纳入版本控制的,例如我编译后的class文件,或者idea产生的一些配置文件等。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
.gradle
/build/
!gradle/wrapper/gradle-wrapper.jar

### STS ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans

### IntelliJ IDEA ###
.idea
*.iws
*.iml
*.ipr

### NetBeans ###
nbproject/private/
build/
nbbuild/
dist/
nbdist/
.nb-gradle/

rebel.xml

/out

上面是我的一个项目的配置,看得出来是有一些规则的,使用起来很简单,将这些规则保存到一个.gitignore中后,在项目里面这些文件或者文件夹里面的所有修改操作都不会被纳入到git版本控制中,也不会提交。

阅读全文 »

Netty源码分析

跟着代码的编写和运行流程来看看Netty的源码和原理,这里面包含了大量NIO的知识,所以我们要对NIO的基础知识要有掌握,不然看Netty的源码是很难受的。那么我们从哪里开始阅读源码呢,既然不知道从何下手,就从运行的例子一个一个往下看吧。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class MyServer {
public static void main(String[] args) throws InterruptedException {
EventLoopGroup bossGroup = new NioEventLoopGroup();
EventLoopGroup workerGroup = new NioEventLoopGroup();

try {
ServerBootstrap serverBootstrap = new ServerBootstrap();
serverBootstrap.group(bossGroup, workerGroup).channel(NioServerSocketChannel.class)
.handler(new LoggingHandler(LogLevel.WARN))
.childHandler(new MyServerInitializer());

ChannelFuture channelFuture = serverBootstrap.bind(8899).sync();
channelFuture.channel().closeFuture().sync();
} finally {
bossGroup.shutdownGracefully();
workerGroup.shutdownGracefully();
}
}
}
阅读全文 »

NIO 零拷贝

OIO在读取文件传输的时候,在操作系统中发生了多次上下文的切换和多次的数据拷贝。

BIO在读取文件的流程图

阅读全文 »

用git已经差不多3年了,回顾一下。

https://git-scm.com/

这个是Git的官网,Git是一款免费、开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。 Git的读音为/gɪt/。

Git是一个开源的分布式版本控制系统,可以有效、高速的处理从很小到非常大的项目版本管理。Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。

Torvalds 开始着手开发 Git 是为了作为一种过渡方案来替代 BitKeeper,后者之前一直是 Linux 内核开发人员在全球使用的主要源代码工具。开放源码社区中的有些人觉得BitKeeper 的许可证并不适合开放源码社区的工作,因此 Torvalds 决定着手研究许可证更为灵活的版本控制系统。尽管最初 Git 的开发是为了辅助 Linux 内核开发的过程,但是我们已经发现在很多其他自由软件项目中也使用了 Git。例如 很多 Freedesktop 的项目迁移到了 Git 上。

阅读全文 »

做过web开发的人一定遇到过中文乱码的问题,一般情况下我们都是直接把所有的编码都设置成UTF-8,可是并没有真正的去理解为什么会导致乱码的问题,这里一起研究一下编码和解码究竟是怎么一回事。

这段代码很简单,就是读取一个文件的内容,然后输出到另外一个文件里面。

阅读全文 »

接下来看看如何用NIO来做一个模拟聊天,通过这个例子来更加理解NIO的使用方式,下面展示了服务端代码,用命令进行测试,然后再用NIO的方式编写客户端进行测试,对NIO的服务端和客户端的开发,都更加深入的理解。

阅读全文 »

参考:http://blog.csdn.net/lianjiww/article/details/53540145

Selector

NIO的三大组件Channel、Buffer、Selector已经讲了2个了,接着我们一起探索一下Selector。

Selector(选择器)是Java NIO的一个组件,能够检测一到多个NIO通道,并能够知晓通道是否为诸如读写事件做好准备。这样,一个单独的线程可以管理多个channel,从而管理多个网络连接。仅用单个线程来处理多个Channels的好处是,只需要更少的线程来处理通道。对于操作系统来说,线程之间上下文切换的开销很大,而且每个线程都要占用系统的一些资源。因此,使用的线程越少越好。

Selector的创建

通过调用Selector.open()方法创建一个Selector,例如:

1
Selector selector = Selector.open();
阅读全文 »