多线程基础

2020-07-14  本文已影响0人  叫我C30混凝土

需要多线程的原因:

1GHZ的CPU做一次加法需要10亿次/秒(次为cycle, HZ为 1/秒)
1 ns = 10^-9 s
内存的寻址时间
1~10μs = 10^3 ~ 10^4 ns
即内存做一次加法的时间,cpu等了10^3 ~ 10^4个cycle
而HDD需要1ms~10ms=10^6 ns
即普通硬盘做一次加法的时间,cpu等了10^6个cycle
让上下文切换尽可能减少:
协程 又名 用户态线程,但需要重写调度器

占用资源:每个线程有独立的方法栈

我是一个CPU:这个世界慢!死!了!

Thread

public static void main(String[] args) {
        //↓↓↓这是另一个线程
        new Thread(() -> {
            while (true){
                i++;
            }
        }).start();

        //↓↓↓这是主线程
        while (true){
            i++;
        }
}
  1. 一个工人/执行流
  2. 一套方法栈
java虚拟机中仅存在xxx.main 或thread.run,不会存在第三种情况
public class ThreadClass {
    static int i = 0;

    public static void main(String[] args) {
        try {
            new Thread(() ->
            {   //这里其他线程的异常只能往当前方法栈中抛,catch中无法看到!!
                throw new RuntimeException();
            }).start();
            doSomething();
        } catch (Exception e) {
            //这里只有主线程doSomething()方法里的异常才能被看到!!
        }
    }
    
    //两个线程,同时在执行doSomething(),生成了两个不同的栈针,方法内的局部变量是私有的,共享的变量i是公有的;
    private static void doSomething() {
        i++;
    }
}
上一篇下一篇

猜你喜欢

热点阅读