8月的天气依然很热,虽算按照24节气来推算,立秋的时候也快了,不过这天气时常不会按照套路出牌。你抬头看看天空,何时有过一片云彩?
昨天的失落依然停留在心头,阴影和不快挥之不去。看着Intellij 上面的代码,真不知道idea何时才能出现,眼神迷离,视线慢慢模糊。
出了电影院已经是凌晨的一刻钟,我抬起手腕,稍微低了下头看了看手表,心里泛起一阵欣喜,转眼对她说:“太晚了,怎么办?学校这会的大门肯定关了。要不我们。。。。。。”我用余光看了看离学校只有两个转角的街道牌,悄悄伸出右手臂,揽了揽她的的右肩。
道路对面“7-24”酒店招牌散射出的猩红的灯光照着她清秀的脸庞,她两眼有点泛红,似乎还沉浸在刚才电影院里放映的那部爱情戏中。
“是啊,天气太热了,我想回家,我室友还等着我回去给她煮咖啡呢,这不你看,她都发微信过来了哦”,她晃了晃手中的Xphone。我点了点头。
“呜,那好,我把刚才app预定下的酒店退了吧。。。”
一夜无眠。。。。
所以。。。。。。。
今天一大早,我就看隔壁邻居家的哪个4岁的孩子不顺眼,她妈妈总是夸他是个神童,什么还没上小学,就已经能背诵唐诗三百首了,而且数学特好。我向他招了招手:“小辫子,过来,大哥哥要出个算术题考考你,你能回答上来,我就买个吹糖人给你”,那小子昂首挺胸地过来了,拍了拍胸脯:“什么题目,随便你出!”
我微微一笑:“听好了,有一辆公交车,经过A站牌的时候,车上有20个人,这时候上来3个,下去6个,然后经过B站牌的时候下去2个上来5个,然后经过C站牌的时候上来7个下去4个,然后经过D站牌上来2个下去一个,又经过一站,上来7个下去2个,又经过一站。。。。。。”
我越说越快,直到我一口气喘不上来,停下来的时候,那小子向我摆了摆手:“不用说了,车上还有4个人对不对?”他很傲娇的回答到。
“不,我的问题是:这个公交车一共经过了多少站。。。”
空气忽然安静,最怕空气忽然安静。。。。
我一直在思考个问题:如果这小子学过java编程,而且碰巧多线程有学的特别好,那么他就能一边计算加减,一边默记公交站点了。。。。。。
1.1 什么是多线程
Concurrency is the ability to run several programs or several parts of a program in parallel
多线程是可以并行地运行多个程序或者一个程序的多个部分的一种能力。
1.2 线程和进程
A process runs independently and isolated of other processes. It cannot directly access shared data in other processes.
进程可以单独地运行,和其他的进程分离开来。但是这个进程并不能访问其它进程中的共享数据。
A thread is a so called lightweight process. It has its own call stack, but can access shared data of other threads in the same process.
线程可以看成是一个轻量级的进程的(lightweight process),和进程不同的是:每一个线程都有自己的调用堆栈(call stack),而且在同一个进程中可以访问其他进程的共享数据。
2.1 简介
Java中的程序默认的会只开启一个线程来运行程序。它会通过Thread类来创建一个线程,从而支撑程序运行。自从java1.5版本之后,jdk可以通过 java.util.concurrent包 增加了对多线程的支持。
2.2 线程锁和方法的异步执行
java提供了锁机制,它可以有效的控制在多个线程同时执行这段代码时候的访问控制。一种简单有效的方法就是直接在java的类上面或者是方法上面添加synchronized关键字,那么此时就开启了对这个类或者这个方法的访问控制。
synchronized关键字可以同时保证以下两点:
* 同一时间内这段代码块只能会被一个线程执行或者访问。
* 每个进入同步代码块的线程都能看到:以前被同一锁保护的代码块,所有修改后的效果。
下面是在一个方法上加上synchronized关键字
public synchronized void critial() {
// some thread critical stuff
// here
}
这样就能保证程序运行正常调用这个critial()函数时,同一时间内,只能有一个线程访问这个方法。同样地,下面这段代码中,add(String str)和next()方法内部,synchronized修饰的代码块也会被同步。
package de.vogella.pagerank.crawler;
import java.util.ArrayList;
import java.util.List;
/**
* Data structure for a web crawler. Keeps track of the visited sites and keeps
* a list of sites which needs still to be crawled.
*
* @author Lars Vogel
*
*/
public class CrawledSites {
private List crawledSites = new ArrayList();
private List linkedSites = new ArrayList();
public void add(String site) {
synchronized (this) {
if (!crawledSites.contains(site)) {
linkedSites.add(site);
}
}
}
/**
* Get next site to crawl. Can return null (if nothing to crawl)
*/
public String next() {
if (linkedSites.size() == 0) {
return null;
}
synchronized (this) {
// Need to check again if size has changed
if (linkedSites.size() > 0) {
String s = linkedSites.get(0);
linkedSites.remove(0);
crawledSites.add(s);
return s;
}
return null;
}
}
}