Java SE学习总结 Day (24)

Day 24开篇:
      
       "今天java基础主要学习了多线程,多线程的好处,如何创建线程,线程引入,单核CPU的进程问题,高并发和高并行问题,单核和多核的进程问题等"



知识点反馈:

今天的知识点总结的思维导图

 

一.程序和进程

1.程序:完成特定的任务,用某一种编程语言写出来的一组指令和集合,其实就是一段静态的代码

2.进程:

(1)我们通常打开任务管理器,就能够看到一个进程的字样;其实进程一个一个的应用程序,只有一个应用的程序的启动,才能开启一个进程或者多个进程。

(2)进程:必须是一个正在运行的程序。

(3)我们都知道一个应用的产生会消耗我们的cpu资源、消耗我们的内存资源

 原因就是一个进程的产生其实就是系统资源分配的产生。每一个进程 系统都会给他一定的资源权限。

 

二.多进程

1.单核CPU当中只能存在一个进程,并且只能完成一件事。

举例:开着IDEA,开着EV录屏,打着游戏是同步完成么?

不是同步完成,单核CPU在同一个时间点只能完成一件事

如果三个程序的进程同时开启的话,其实会有一个运行片段的概念,一个进程抢夺到资源有可能瞬间被其他进程抢占了。只不过他们的切换速度是我们根本感觉不到的,所有也就造成一个所谓的同时执行的概念。

2.那么存在多进程的好处是什么?

 多进程提供程序运行效率?

 不能,从某种角度上来说,支持的进程越多,那么分配(切换)的资源也就越多,反而影响效率。

只能提高CPU的使用率。

3.线程:

(1)一个程序在执行的过程当中,能不能执行多个任务?

 在一个进程当中的一条执行路径被称之为一个线程.360在扫描病毒的时候,顺便可以清理垃圾,则说明360可以同时执行多条路径,并且不被中断(多线程)

(2)线程是基于进程

(3)单线程:一个程序(进程)只能同时干一件事情(执行路径)

(4)多线程:一个程序(进程)能够同时运行多个任务(执行路径)

4.多线程的好处?

(1)多线程是提高程序是执行效率?

  不是,只能提高进程的使用率(效率跟线程没有关系,甚至有可能影响程序的运行效率)

(2)多线程的存在,除了可以提高进程的使用率,还可以帮助进程更加可能的抢夺到CPU的资源。因为线程本质也具备抢夺资源的能力,多个线程的几率远比单个线程要多。在Java当中,资源的抢夺是具备严重的随机性的。

(3)本质上还可以提高程序的响应,但是一般只适用在图形化界面上面

(4)改善程序的结构,将原来一个又长又复杂的进程结构拆分为多个细小的线程,独立运行,便于理解和修改(你们想都别想,工作个几年在考虑使用线程完善)

5.并行和并发的问题?

(1)并行:多个CPU同时执行多个任务

(2)高并行:所谓的高并行,其实就是在一个时间段内,大量的进程开辟了多数的CPU,消耗原有的进程数量,当数量达到瓶颈的时候,则为高并行。

(3)并发:一个CPU(采用的是时间片)同时执行多个任务(秒杀)

(4)高并发:所谓的高并发,是指在同一个时间点内,涌入的线程数量或者说进程数量已经达到了你当前业务或者说系统能够支撑的瓶颈访问。

 6. JVM是多线程还是单线程的?

 多线程的,JVM默认就有三个线程同步执行(main(主线程)、GC(垃圾回收),异常处理线程)

 7.如何创建线程?

需要一个线程类。

用于线程类实现或者继承某一个接口或者父类。

继承方式:Thread:

线程是程序中的执行线程。Java虚拟机允许应用程序并发地运行多个执行线程。

 (1)通过一个普通类,来继承Thread的类,从而获得Thread的所有公开功能

 (2)重写void run():运行线程,所有需要被线程执行的代码存放到run方法里面

 (3)执行线程:run方法并不是执行线程,只是一个很普通的调用;那么如何执行线程:void start():使该线程开始执行;Java 虚拟机调用该线程的 run 方法。

例子:

package Thread;

class Thread01 extends Thread{

    @Override

    public void run() {

        for (int i = 1; i <= 100; i++) {

            System.out.println(i);

        }

    }

}

public class Demo {

    public static void main(String[] args) {

        Thread01 t1 = new Thread01();

        //不是启动线程,只是调用了一个很普通的run方法

        //t1.run();

        //如何调用线程?使用start进行调用,其实就是让JVM来调用线程类的run方法。

        t1.start();

        Thread01 t2 = new Thread01();

        //t2.run();

        t2.start();

        //IllegalThreadStateException 同一个线程只能被启动一次。

        //t2.start();

    }

}

8.给线程设置名称:void setName(String name):给指定线程设置名称

9.获取线程名称:String getName():获取当前线程的名称

10.如何获取非线程类的当前执行线程:

(1)static Thread currentThread():返回当中执行线程的线程对象

(2)Thread.currentThread().getName():链式编程直接获取名字

例子:

package Thread;

class Thread02 extends Thread{

@Override

 public void run() {

        for (int i = 1; i <= 100; i++) {

            System.out.println(getName()+"--"+i);

        }

    }

}

public class Demo02 {

    public static void main(String[] args) {

        System.out.println(10/0);

        Thread02 t = new Thread02();

        Thread02 t1 = new Thread02();

        //设置线程名称

        t.setName("刘同");

        t1.setName("陈默");

        t.start();

        t.start();

        //返回当中正在执行线程的线程对象

        Thread t3 = Thread.currentThread();

        //通过获取线程对象来获取当中线程的名称

        //JVM会默认先调用主线程,但是主线程仍然存在和其他线程竞争的问题,不过主线程的优先级是最高的

        System.out.println(t3.getName());

        //链式编程

        //System.out.println(Thread.currentThread().getName());

    }

}

11.线程引入

12.单核CPU的进程问题

13.高并发和高并行

14. 单核和多核的进程问题

发布了30 篇原创文章 · 获赞 7 · 访问量 3701

猜你喜欢

转载自blog.csdn.net/weixin_45406656/article/details/104336762
今日推荐