0%

事件:打电话订外卖,拨通老板电话,询问菜品,选菜。

同步:老板说:”我看一下厨房,还有没菜,还能不能做!”,然后就去问了,等确认后告诉你结果。(可能一分钟,也可能好久好久)
异步:老板说:”我去查一下,查好了电话告诉你!”,然后就挂电话了。(不返回结果)等确认后,给你打电话。

阻塞:你等待,不去做任何事情,一直等待结果。
非阻塞:你不等待,先去做别的事情,偶尔检查一下老板有没有老板的消息。

一、初始化仓库
1
2
3
4
# 新建一个目录,将其初始化为Git代码库
git init [project-name]
# 下载一个项目和它的整个代码历史
git clone [url]
二、工作区–>暂存区
1
2
3
4
5
6
# 添加指定文件到暂存区
git add [file1] [file2] ...
# 添加当前目录的所有文件到暂存区
git add .
# 从暂存区删除到工作区
git rm --cached <file>...
阅读全文 »

1.红眼睛和蓝眼睛

一个岛上有100个人,其中有5个红眼睛,95个蓝眼睛。这个岛有三个奇怪的宗教规则。
  • 他们不能照镜子,不能看自己眼睛的颜色。
  • 他们不能告诉别人对方的眼睛是什么颜色。
  • 一旦有人知道了自己是红眼睛,他就必须在当天夜里自杀。
某天,有个旅行者到了这个岛上。由于不知道这里的规矩,所以他在和全岛人一起狂欢的时候,不留神就说了一句话:【你们这里有红眼睛的人。】
假设这个岛上的人足够聪明,每个人都可以做出缜密的逻辑推理。请问这个岛上将会发生什么?

笔者认为只要能在Windows下运行的项目,在MacOS、Linux出现问题的概率会很小,所以此次选择在Windows环境下安装运行zookeeper项目。

1.下载地址

ZooKeeper下载地址

2.解压安装

使用解压工具对压缩包进行解压

3.配置参数
  • 进入conf文件夹
  • 复制zoo_sample.cfg文件为zoo.cfg
  • 配置参数
    阅读全文 »

Selector(选择器)是Java NIO中能够检测一到多个NIO通道,并能够知晓通道是否为诸如读写事件做好准备的组件。这样,一个单独的线程可以管理多个channel,从而管理多个网络连接。

SelectServer.java

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
30
31
32
33
34
35
36
37
38
39
public class SelectServer {
public static void main(String[] args) throws IOException {
ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
serverSocketChannel.socket().bind(new InetSocketAddress(9999));
serverSocketChannel.configureBlocking(false);
Selector selector = Selector.open();
SelectionKey selectionKey = serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);
while (true) {
int select = selector.select();
if (select > 0) {
Iterator keyIterator = selector.selectedKeys().iterator();
while (keyIterator.hasNext()) {
SelectionKey next = (SelectionKey) keyIterator.next();
keyIterator.remove();
if (next.isAcceptable()) {
System.out.println("isAcceptable");
SocketChannel channel = ((ServerSocketChannel) next.channel()).accept();
channel.configureBlocking(false);
channel.register(selector, SelectionKey.OP_READ);
} else if (next.isConnectable()) {
System.out.println("connect");
} else if (next.isReadable()) {
System.out.println("isReadable");
SocketChannel socketChannel = (SocketChannel) next.channel();
ByteBuffer readByteBuffer = ByteBuffer.allocate(100);
int read = socketChannel.read(readByteBuffer);
System.out.println(new String(readByteBuffer.array(), 0, read));
socketChannel.register(selector, SelectionKey.OP_WRITE);
socketChannel.write(readByteBuffer);
} else if (next.isWritable()) {
System.out.println("isWritable");
SocketChannel socketChannel = (SocketChannel) next.channel();
socketChannel.register(selector, SelectionKey.OP_READ);
}
}
}
}
}
}
阅读全文 »

FileChannel 从文件中读写数据。

FileChannelTest.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class FileChannelTest {

public static void main(String[] args) throws IOException {
FileChannel inputFileChannel = new FileInputStream("file.text absolute path").getChannel();
ByteBuffer readBuffer = ByteBuffer.allocate(100);
inputFileChannel.read(readBuffer);
readBuffer.flip();
for (int i = 0; i < readBuffer.limit(); i++) {
System.out.println((char) readBuffer.get());
}

FileChannel outputFileChannel = new FileOutputStream("file.text absolute path", true).getChannel();
ByteBuffer writeBuffer = ByteBuffer.wrap("TOM".getBytes());
outputFileChannel.write(writeBuffer);

inputFileChannel.close();
outputFileChannel.close();
}
}
阅读全文 »

1.变量:

capacity: 指定了可以存储在缓冲区中的最大数据容量,实际上,它指定了底层数组的大小,或者至少是指定了准许我们使用的底层数组的容量。
position: 下一次读取或写入的位置。(每次调用get put方法+1)
limit:指定还有多少数据需要取出,或者还有多少空间可以放入数据。(每次调用get put方法时候,通过position与limit对比)

2.方法:

get:position + 1
put:position + 1
flip:limit = position position = 0 mark = -1
clear:limit = capacity position = 0 mark = -1
mark: mark = position
reset:position = m;
duplicate:浅拷贝(每个缓存区的上界、容量、位置等属性是各自独立的)

阅读全文 »

Send.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class Send {
public static String EXCHANGE_NAME = "test_exchange_topic";

public static void main(String[] args) throws IOException, TimeoutException {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
factory.setVirtualHost("/zhang");
factory.setUsername("zhang");
factory.setPassword("zhang");
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();
channel.exchangeDeclare(EXCHANGE_NAME, "topic");
String message = "message";
channel.basicPublish(EXCHANGE_NAME, "item.broadcast", null, message.getBytes());
channel.close();
connection.close();
}
}
阅读全文 »