iterator 和 stream在一点上是相似的,他们都没有size的方法,是因为在网络上传东西,或者是处理比较大的东西,是很难计算size,就不如,来一个处理一个
Thread
main线程开始后,就结束了,然后开始运行main里runnable的thread
public static void main(String[] args) {
// TODO 代码是被线程执行的,任何代码都可以通过Thread.currentThread()获取执行当前代码的线程
System.out.println("程序开始,执行的线程名字叫做" + Thread.currentThread().getName());
// TODO 改成2试试看?
for (int i = 1; i <= 2; i++) {
// TODO 学习创建线程的方法
// TODO Runnable接口里的run是线程执行的方法,执行完毕,线程就结束了
// TODO 理解代码是在线程里被执行的,同样的代码可以被多个线程执行。
// TODO 暂停一下 Java ,看看有多少线程,每个线程的名字等信息
Thread thread = new Thread(new PrintStoryRunnable(TEXT, 200 * i), "我的线程-" + i);
// TODO 创建好线程之后,如果要启动线程,必须调用start方法,注意不是run方法
thread.start();
}
System.out.println("启动线程结束,名字叫做" + Thread.currentThread().getName());
}
static class PrintStoryRunnable implements Runnable {
private String text;
private long interval;
public PrintStoryRunnable(String text, long interval) {
this.text = text;
this.interval = interval;
}
@Override
public void run() {
try {
double num = Math.random();
System.out.println("执行这段代码的线程名字叫做" + Thread.currentThread().getName());
printSlowly(text, interval);
System.out.println(Thread.currentThread().getName() + "执行结束");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static void printSlowly(String text, long interval) throws InterruptedException {
for (char ch : text.toCharArray()) {
Thread.sleep(interval);
System.out.print(ch);
}
System.out.println();
}
lambda的妙用
Thread thread1 = new Thread(new PRunn(0));
thread1.start();
static class PRunn implements Runnable{
public int i;
public PRunn(int i) {
this.i=i;
}
@Override
public void run() {
}
}
用lambda代替
wait 方法必须在进入相应对象的synchronized块中才能调用
执行 wait 方法之后,自动失去对象的 monitor,也就是说别的线程可以进入这个对象的synchronized代码
随机字母生成
for (int i = 0; i < 6; i++) {
int rand = ((int) (Math.random() * 1000)) % 26;
char ch = (char) (rand + ‘a’);
ret.append(ch);
}
join
调用join马上返回 原因1:thread没start 2.thread已经结束