Java之Java web(冯诺依曼体系,操作系统,进程,线程的创建)

冯诺依曼体系

在这里插入图片描述

操作系统

是一个软件,搞管理的软件,一方面管理计算机硬件设备,另一方面管理计算机软件资源。

一个完整的操作系统=内核+配套的应用程序

在这里插入图片描述

操作系统具体管理主要是两件事:
1.描述
2.组织

进程
对于操作系统来说,一个任务就是一个进程(Process)。
进程是操作系统的非常重要的软件资源
如果把一个可执行程序跑起来,系统就会创建一个对应的进程,如果把这个程序结束了,系统就会随之销毁进程,进程可以看成是一个程序的执行“过程”。(是动态性的)

进程是操作系统进行资源分配的最小单位。

但进程一般是很多的,CPU太少了,从微观上看,一个CPU同一时刻只能执行一个进程的指令,这时通过“并发”的方式,让CPU快速调度,微观上仍是串行执行,但是调度速度很快,宏观上感觉就是在多个进程齐头并进。

在进程调度时,有抢占式调度方式,,哪怕某个进程只工作了一半,也随时可能被打断。

线程

thread

如果把进程想象成一个工厂,线程就是 工厂中的若干流水线。
1.线程是包含在进程里的
2.一个进程可能有多个线程
3.同一个进程中的很多线程之间,是共享了一些资源的。(进程之间是不能共享的)

线程是轻量级:进程,
引进线程原因:
创建一个线程比创建一个进程成本低
销毁一个线程比销毁一个进程成本也低

成本低的原因是,新建一个线程,不需要给这个线程分配很多新资源,大部分线程之间都是和原来的线程资源共享的,如果创建一个进程,就需要给这个进程分配较多资源。

线程是操作系统进行调度和执行的最小单位

一个线程是一个pcb,一个进程是多个pcb(使用线程组Id来标识,哪些pcb从属同一个进程)。

一个进程中的多个线程之间可以并发工作,但也有限,一个进程中的线程不能太多否则就不会再提高效率了,反而会拖慢。

一个进程中的线程数:
1.CPU个数
2.和线程执行的任务类型也相关
任务类型:
1.CPU密集型:程序一直在执行计算任务
2.IO密集型:程序没咋进行计算,主要进行输入输出操作

同时,多线程工作也是有不安全风险的,比如线程之间抢资源,或者一个线程出现异常,并没有处理好,那其他线程也就没办法工作了

创建线程

public class ThreadDemo1 {
    static class MyThread extends Thread {
        @Override
        public void run() {
            System.out.println("hello world");
        }
    }
    public static void main(String[] args) {
        //需要使用Thread类  还需指定这个线程要执行哪些指令
        //重写Thread中的run方法
        //Thread对象被创建出来时,内核中并没产生线程
        Thread t = new MyThread();
        //执行start方法才创建了一个线程
        t.start();
    }
}

其实上面代码涉及两个线程,Mythread创建出来的线程,main中对应的主线程。

代码实现串行,并行

public class ThreadDemo2 {
    private static long count = 10000000000L;
    public static void main(String[] args) {
        seriaL();
        concurrency();
    }

    private static void concurrency() {
        long beg = System.currentTimeMillis();
        Thread t1 = new Thread() {//匿名内部类

            @Override
            public void run() {
                int a = 0;
                for(long i = 0;i<count;i++) {
                    a++;
                }
            }
        };
        Thread t2 = new Thread() {//匿名内部类

            @Override
            public void run() {
                int b = 0;
                for(long i = 0;i<count;i++) {
                    b++;
                }
            }
        };
        t1.start();
        t2.start();
        try {
            //让主线程等待t1,t2执行结束
            t1.join();
            t2.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

//t1和t2和main线程之间都是并发进行的
        long end = System.currentTimeMillis();
        System.out.println("time:"+(end-beg)+"ms");

    }

    private static void seriaL() {
        long beg = System.currentTimeMillis();//获取时间戳
        int a = 0;
        for(long i = 0;i<count;i++) {
            a++;
        }
        int b = 0;
        for(long i = 0;i<count;i++) {
            b++;
        }
        long end = System.currentTimeMillis();
        System.out.println("time:"+(end-beg)+"ms");

    }
}

在这里插入图片描述
可得并行执行时间会得以提高

创建线程方法:
1.可以通过显示继承Thread类方式实现
2.也可以通过匿名内部类方式继承Thread类
3.创建一个类,实现Runnable接口,然后把这个Runnable的实例关联到Thread实例上。

public class ThreadDemo3 {
    static class MyRunnable implements Runnable {
        //本质是描述了要执行的任务代码是啥
        @Override
        public void run() {
            System.out.println("我是新线程");
        }
    }
    public static void main(String[] args) {
        Thread t = new Thread(new MyRunnable());
        t.start();

    }
}

4.也可以使用内名内部类去重写runnable里的run方法来创建线程。

public static void main(String[] args) {
        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                System.out.println("我是新线程");
            }
        };
        Thread t = new Thread(runnable);
        t.start();

5.也可以使用lambda表达式

 Thread t = new Thread(()-> {
           System.out.println("我是一个新线程");
       });
       t.start();
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章