0%

生产者消费者模型的特点:

保证生产者不会在缓冲区满的时候继续向缓冲区放入数据,而消费者也不会在缓冲区空的时候,消耗数据。

当缓冲区满的时候,生产者会进入休眠状态,当下次消费者开始消耗缓冲区的数据时,生产者才会被唤醒,开始往缓冲区中添加数据;当缓冲区空的时候,消费者也会进入休眠状态,直到生产者往缓冲区中添加数据时才会被唤醒。

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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
import lombok.extern.slf4j.Slf4j;
import java.util.concurrent.TimeUnit;


public class ProducerAndConsumerDemo {

public static void main(String[] args) {

Store store = new Store(10);

new Thread(new Producer(store), "producer").start();
new Thread(new Consumer(store), "consumer1").start();
new Thread(new Consumer(store), "consumer2").start();
}
}


@Slf4j
class Store {

private Integer capacity;
private Integer count = 0;

public Store(Integer capacity) {
this.capacity = capacity;
}

public Boolean isFull() {
return this.count >= this.capacity;
}

public Boolean isEmpty() {
return this.count <= 0;
}

synchronized void produce() throws InterruptedException {

if (this.isFull()) {

log.info("仓库满了,停止生产");
wait();

} else if (this.isEmpty()) {

log.info("仓库空了, 放入第" + count + "号位置,并通知消费者");
this.count++;
TimeUnit.SECONDS.sleep(1);
notifyAll();

} else {

log.info("放入第" + count + "号位置");
this.count++;
TimeUnit.SECONDS.sleep(1);

}

}

synchronized void consume() throws InterruptedException {

if (this.isEmpty()) {

log.info("仓库空了,停止消费");
wait();

} else if (this.isFull()) {

this.count--;
log.info("仓库满了,取出第" + count + "号位置, 并通知生产者");
TimeUnit.SECONDS.sleep(2);
notifyAll();

} else {

this.count--;
log.info("取出第" + count + "号位置");
TimeUnit.SECONDS.sleep(2);

}
}
}

class Producer implements Runnable {

private Store store;

public Producer(Store store) {
this.store = store;
}

@Override
public void run() {

while (true) {
try {
store.produce();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}

class Consumer implements Runnable {

private Store store;

public Consumer(Store store) {
this.store = store;
}

@Override
public void run() {
while (true) {
try {
store.consume();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}

通过httpclient POST请求上传文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
CloseableHttpClient httpClient = HttpClients.createDefault();

HttpPost httpPost = new HttpPost("http://localhost:8080/upload");

MultipartEntityBuilder builder = MultipartEntityBuilder.create();
builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);

// 可以添加File或者InputStream
builder.addBinaryBody("file", file.getInputStream(), ContentType.MULTIPART_FORM_DATA, filename);
builder.addTextBody("name", name);

HttpEntity entity = builder.build();
httpPost.setEntity(entity);
CloseableHttpResponse response = httpClient.execute(httpPost);
Integer httpCode = response.getStatusLine().getStatusCode();

if (HttpStatus.SC_OK != httpCode) {
throw new RuntimeException("failed...");
}

// 处理responseEntity
String respEntity = EntityUtils.toString(response.getEntity());

GET请求

1
2
3
4
5
6
7
8
9
10
11
12
CloseableHttpClient httpClient = HttpClients.createDefault();

// URL的拼接
URI uri = new URI("http://localhost:8080").resolve("result");
HttpGet httpGet = new HttpGet(uri);

CloseableHttpResponse response = httpClient.execute(httpGet);
Integer httpCode = response.getStatusLine().getStatusCode();

if (HttpStatus.SC_OK != httpCode) {
throw new RuntimeException("failed...");
}

判断请求返回的内容类型

1
2
3
4
5
6
ContentType contentType = ContentType.getOrDefault(response.getEntity());
if (MediaType.APPLICATION_JSON_VALUE.equals(contentType.getMimeType())) {

} else if (MediaType.TEXT_PLAIN_VALUE.equals(contentType.getMimeType())) {

}

很早前买的Macbook Pro mid 2014, 15” Retina,硬盘只有256G,装几个大的软件,或者虚拟机装几个Linux操作系统做大数据集群实验,空间就不够了。

今天来升级一下系统,由最初的256G升级到1T。

在升级之前,我至少准备了一周的时间,做足了功课。一是因为文件都挺重要,要是弄丢了就麻烦了。还有就是把系统搞崩了,又要花大量时间去做恢复,很耽误时间。

这里面有非常多的坑,哪怕版本不正确,都会带来各种各样的问题。

我目前的系统是macOS High Sierra 10.13.6。

Boot ROM版本是162.0.0.0

老硬盘接口是PCI 2代,通道也只有2个。

准备材料

三星980硬盘

我的电脑型号是Mac Pro mid 2014, 15” Retina,硬盘接口是PCI 2代,所以比较后买的硬盘是三星980,这个是PCI 3代。有些人买三星980 Pro,PCI
4代的硬盘,其实完全是浪费了,因为主板的限制,发挥不出硬盘的性能,哪怕只是多个小几百块钱,也是没必要的浪费,再用两三年,可以换个新的整机了。

ssd连接卡

苹果使用的接口,是不能直接插入三星的ssd的。需要使用这个转接口。

其他工具

两种螺丝刀,一个是用于开盖的,一个是用于拧固定硬盘的螺丝刀的。还有一个散热器,在苹果里面应该是用不到了,如果加上的话,太厚了。

备份

使用苹果自带的Time Machine机制来备份。

首先准备一个移动硬盘。

如果移动硬盘的系统类型和苹果的不同,还要抹掉硬盘上面所有内容才可以备份。

选择备份文件的磁盘。

然后点击立即备份。

备份时间蛮长的,256G花了好几个小时。建议周五晚上开始备份,或者把一些不需要备份内容排除掉。

升级固件

我Macbook Pro的固件版本,由上面可知是162.0.0.0,必须要升级到427.0.0.0,大于427,比如429,也会出现睡眠问题,不过更新的版本,也没有尝试,所以也不知道会不会遇到其他问题。

让固件升级到427.0.0.0,我现在了解的,已经被实验成功的,必须是苹果原装硬盘,系统得是Big Sur 11.01版本。但现在官方网站上,Big Sur已经到11.6版本了。

所以不能通过App Store安装了,只能下载Big Sur 11.01的镜像来安装了。找不到这个版本镜像的可以给我留言。

等我们把固件升级好了以后,换上新硬盘,再用上面通过Time Machine备份的内容,恢复到我现在正常的High Sierra就行了。

在升级系统之前,我们可以把一些大文件先删除掉,因为已经备份过了,这样可以让升级操作系统时有足够的空间。

安装Big Sur 11.01版本,版本不要错了,因为我们只需要把固件升级到427.0.0.0。

经过大约一个小时的安装,Big Sur 11.01就安装好了。

查看固件版本,顺利升级到427.0.0.0。

换硬盘

带上手套操作,特别是夏天的时候,一定要防止手上的汗水滴污染主板。

拧螺丝的时候,一定要用力往下压,不然弄花掉了螺丝就松不开了。螺丝的位置摆放好,有两种长度的螺丝。

正常情况下,打开后盖后可以看到机器里面很多灰尘,特别是出风口附近。找来吹风和刷子,把灰尘清理干净。

然后断电,让主板和电池的接接线断开。

换一个螺丝刀,把硬盘拆下来。

拆开新硬盘,接上NVME转接口。

再插入SSD插槽。

硬盘的标签不用撕掉。

恢复

开机,同时按住 Command + Option + R,一定要有Option,之前没按Option,结果进去没找到新硬盘。

选择硬盘工具,然后选中三星980硬盘,格式化,AFPS格式,建议不选择加密,抹掉所有内容。

重新启动,按刚才的方法,选择通过时间机器恢复。把最初备份的High Sierra的系统恢复到新硬盘中。大约几个小时就搞定了。

这里我就不测试硬盘的速度了。

查看硬件信息,可以使用4条通道了。

查看了一下硬件温度,还行。