java基础之线程知识点

这篇具有很好参考价值的文章主要介绍了java基础之线程知识点。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

线程

进程的概念

操作系统(OS)中并发(同时)执行的多个程序任务

进程的特点

  • 宏观并行,微观串行

在一个时间段内,CPU会将时间段划分为若干个时间片,一个时间片是能被一个程序拥有,且只有拥有时间片的程序才能执行自身内容,所以当时间片的划分足够细小,交替频率足够快,就会形成并行的假象,时间上仍然是串行.

线程的概念

  • 是进程的基本组成部分

是进程中并发执行的多个任务

线程的特点

  • 宏观并行,微观串行

一个时间片只能被一个进程拥有,一个进程一次又只能执行一个线程. 由于进程之间交替执行,所以线程之间必定也是交替执行

多线程

  • 只存在多线程,不存在多进程

正在执行中的程序才叫进程,其他的都是等待执行的程序

无论是否拥有时间片,线程任务都叫线程

线程执行的组成

  1. 时间片

    • CPU调度分配, 线程争抢拥有

  2. 数据

    • 堆: 堆共享

    • 栈: 栈独立

  3. 代码

    • 书写逻辑

线程的创建

  1. 继承Thread, 重写run方法

    public class MyThread extends Thread {
        @Override
        public void run() {
            for (int i = 1; i <=100 ; i++) {
                System.out.println(i);
            }
        }
        
    }
    package com.by.test;
    ​
    import com.by.thread.MyThread;
    ​
    public class Test1 {
        public static void main(String[] args) {
            Thread t1 = new MyThread();
            Thread t2 = new MyThread();
    ​
            t1.start();
            t2.start();
            /*t1.run();
            t2.run();*/
    ​
            System.out.println("main结束");
        }
    }
  2. 实现Runnable,重写run方法. 在Thread对象的构造中传入任务对象

    package com.by.dao.impl;
    ​
    /**
     * 线程任务
     */
    public class MyRunnable implements Runnable{
        @Override
        public void run() {
            for (int i=1;i<=100;i++) {
                System.out.println(i);
            }
        }
    }
    package com.by.test;
    ​
    import com.by.dao.impl.MyRunnable;
    ​
    import javax.print.attribute.standard.RequestingUserName;
    ​
    public class Test2 {
        public static void main(String[] args) {
            /*//先创建任务对象
            Runnable r = new MyRunnable();
            //将任务对象传入线程对象
            Thread t1 = new Thread(r);*/
        //任务只会执行一次时,可以通过匿名内部类或者lambda简化书写
           Thread t1=new Thread(new Runnable() {
               @Override
               public void run() {
                   for (int i = 1; i <=100 ; i++) {
                       System.out.println("t1:: "+i);
                   }
               }
           });
    ​
           Thread t2=new Thread(()->{
                   for (int i = 101; i <=200 ; i++) {
                   System.out.println("t2> "+i);
               }
           });
    ​
            t1.start();
           t2.start();
    ​
    ​
        }
    }

更推荐使用第二种创建方式: 更符合类的单一职责,将线程对象的创建与线程任务的书写分离,更有利于后期的维护

使用

  1. 当开启多个线程之后, 线程之间会争抢时间片,拿到时间片的线程执行自身内容,其他线程无法执行,只能继续尝试争抢时间片,直到线程内容执行结束,才会脱离争夺队列

  2. 主函数也成为主线程,其一定是首个拥有时间片的线程

  3. 当开启多个线程之后,JVM执行结束的标志将从主函数执行结束转换为所有线程执行结束

  4. 开启线程需要调用线程对象.start()方法

线程状态

基础状态

java基础之线程知识点,java,java,开发语言

等待状态

  • 也称为阻塞状态

  1. sleep()

    • Thread.sleep(毫秒数): 使当前线程释放自身时间片, 进入有限期休眠状态,在休眠时间内,该线程无法争抢时间片,休眠结束之后,才可以进入到就绪状态

      • 1秒=1000毫秒

    • 该方法需要处理非运行时异常, run方法不可上抛异常,所以必须通过try-catch处理解决

    Thread t1=new Thread(new Runnable() {
               @Override
               public void run() {
                   //让当前线程休眠3秒钟
                   try {
                       Thread.sleep(3000);
                   } catch (InterruptedException e) {
                       System.out.println("休眠异常");
                   }
                   for (int i = 1; i <=100 ; i++) {
                       System.out.println("t1:: "+i);
                   }
               }
           });
  2. join()

    • 线程对象.join(): 使调用者线程在当前线程之前执行, 当前线程只有等调用者线程执行结束进入死亡状态之后才有可能回到就绪状态.

    • 该方法需要处理非运行时异常,run方法无法上抛,必须通过try-catch处理

    package com.by.test;
    ​
    public class Test3 {
        public static void main(String[] args) {
            //以下代码执行顺序:t1->t2->t3
            Thread t1=new Thread(()->{
                for (int i = 0; i < 30; i++) {
                    System.out.println("t1:  "+i);
                }
            });
    ​
            Thread t2=new Thread(()->{
                //使t1线程在t2线程之前执行
                try {
                    t1.join();
                } catch (InterruptedException e) {
                    System.out.println("join失败");
                }
                for (int i = 101; i < 130; i++) {
                    System.out.println("t2>"+i);
                }
            });
    ​
            Thread t3=new Thread(()->{
                try {
                    t2.join();
                } catch (InterruptedException e) {
                    System.out.println("join失败");
                }
                for (char i = 65; i <=90; i++) {
                    System.out.println("t3::"+i);
                }
            });
    ​
    ​
            t1.start();
            t2.start();
            t3.start();
        }
    }

sleep和join的区别?

  1. sleep方法进入的是有限期等待状态,join方法进入的是无限期等待状态

  2. sleep是静态方法,可以直接通过类名调用,join是非静态方法,必须通过线程对象调用

线程池

前言: 当一个任务需要多次执行时,如果将任务放置于线程对象Thread中,会浪费内存空间导致不合理的并发,线程池可以解决该问题

作用

管理盛放线程任务, 将需要执行的任务提交执行,任务结束之后池与任务并不会立即销毁,任务对象会回到池中等待下次执行,直到线程池关闭,内部任务才会失效

创建-API

  1. ExecutorService: 线程池接口

    • submit(线程任务对象): 提交线程任务使其执行

    • shutdown(): 关闭线程池

  2. Executors: 线程池工具类,用来获取线程池对象

    • newCachedThreadPool(): 获取一个不固定并发数量的线程池对象

    • newFixedThreadPool(int ):获取一个固定并发数量的线程池对象

    不固定并发数量的线程池: 所有提交到池中的任务都会同时并发

    固定并发数量的线程池: 对应并发数量的任务先并发执行,超出的任务需要等待执行,等池中执行的任务结束让位之后,超出部分的任务才会进入池中执行

线程任务

  1. Runnable: run()

    • 无返回值,不能上抛异常

    package com.by.test;
    ​
    import com.by.dao.impl.MyRunnable;
    ​
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    ​
    public class Test4 {
        public static void main(String[] args) {
            //获取一个不固定并发数量的线程池
           // ExecutorService es1 = Executors.newCachedThreadPool();
            ExecutorService es1 = Executors.newFixedThreadPool(2);
    ​
            Runnable r1=new Runnable() {
                @Override
                public void run() {
                    for (int i = 0; i < 50; i++) {
                        System.out.println("r1>>"+i);
                    }
                }
            };
            Runnable r2=new Runnable() {
                @Override
                public void run() {
                    for (int i = 50; i < 100; i++) {
                        System.out.println("r2:::"+i);
                    }
                }
            };
            //提交任务执行
            es1.submit(r1);
            es1.submit(r2);
            es1.submit(r2);
    ​
            //关闭线程池
            es1.shutdown();
        }
    }
  2. Callable: call()

    • 有返回值,可以上抛异常,默认上抛Exception

    • 返回值会存放于一个Future对象中,可以通过Future对象.get()获取内部的返回值文章来源地址https://www.toymoban.com/news/detail-790783.html

    Callable<返回值类型> c1=new Callable<返回值类型>() {
                @Override
                public 返回值类型 call() throws Exception {
                   //...
                    return 值;
                }
            };
    package com.by.test;
    ​
    import java.util.concurrent.Callable;
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    import java.util.concurrent.Future;
    ​
    public class Test5 {
        public static void main(String[] args) throws Exception {
            //创建线程池
            ExecutorService es = Executors.newCachedThreadPool();
            //线程任务1: 计算1-100的和并返回
            Callable<Integer> c1=new Callable<Integer>() {
                @Override
                public Integer call() throws Exception {
                    int sum=0;
                    for (int i = 0; i < 101; i++) {
                        sum += i;
                    }
                    return sum;
    ​
                }
            };
            //提交任务执行并接收
            Future<Integer> f =es.submit(c1);
            System.out.println(f.get());
    ​
            System.out.println(es.submit(c1).get());
    ​
            //关闭线程池
            es.shutdown();
        }
    }

到了这里,关于java基础之线程知识点的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • java基础知识点复习①

    java是一门开源的面向对象的编程语言,具有面向对象的封装、继承、多态的特点。 封装:将类的某些信息隐藏起来,只提供特定的方法来访问或修改这些隐藏信息,从而防止直接操作类中的某些属性。是通过访问权限修饰符来实现封装的,public——protected——default——pri

    2023年04月22日
    浏览(33)
  • Java集合基础知识点复习

    主要分为两类: 第一个是Collection 属于单列集合,第二个是Map 属于双列集合在Collection中有两个子接口List和Set。在我们平常开发的过程中用的比较多像list接口中的实现类ArrarList和LinkedList。 在Set接口中有实现类HashSet和TreeSet。 在map接口中有很多的实现类,平时比较常见的是

    2024年04月08日
    浏览(41)
  • Java基础-知识点03(面试|学习)

    String 类是Java中用于表示字符串的类。在Java中,字符串是一系列字符的序列,用于表示文本数据。 String类的作用及特性 1、 创建字符串 : 可以通过字符串字面量或使用new来创建字符串对象。 2、 字符串长度 : 可以使用length()方法获取字符串的长度。 3、 字符串连接

    2024年04月15日
    浏览(40)
  • java基础知识点系列——分支语句(六)

    流程控制语句分类 顺序结构 分支结构 循环结构 顺序结构 顺序结构是程序中最简单最基本的流程控制,没有特定的语法结构,按照代码的先后顺序,依次执行。 if语句格式1 执行流程: 首先计算关系表达式的值 如果关系表达式的值为true就执行语句体 如果关系表达式的值为

    2024年02月02日
    浏览(32)
  • Java面试知识点(全)- Java面试基础部分一

    Java面试知识点(全)https://nanxiang.blog.csdn.net/article/details/130640392 语法基础 封装 利用抽象数据类型将数据和基于数据的操作封装在一起,使其构成一个不可分割的独立实体。数据被保护在抽象数据类型的内部,尽可能地隐藏内部的细节,只保留一些对外接口使之与外部发生联

    2024年02月05日
    浏览(29)
  • 【C++】——C++基础知识点(C++和C语言的区别)

    C++是在C的基础之上,容纳进去了面向对象编程思想,并增加了许多有用的库,以及编程范式 等。熟悉C语言之后,对C++学习有一定的帮助。 本博客目标: 1.补充C语言语法的不足,以及C++是如何对C语言设计不合理的地方进行优化的,比如:作用域方面、IO方面、函数方面、指

    2024年02月03日
    浏览(35)
  • Java基础常考知识点(基础、集合、异常、JVM)

    作者: 逍遥Sean 简介:一个主修Java的Web网站游戏服务器后端开发者 主页:https://blog.csdn.net/Ureliable 觉得博主文章不错的话,可以三连支持一下~ 如有需要我的支持,请私信或评论留言! 本文收集Java核心的面试常考知识点,码起面试之前复习!!! JDK(Java SE Development Kit) ,

    2024年02月07日
    浏览(39)
  • Python爬虫|基础知识点详细汇总(requests、urllib、re、bs4、xpath、PyQuery、jsonpath、多线程、协程、数据保存、selenium)

    1. 请求数据 ① requests (1) 基本使用 参数 对响应内容的操作 (2) Requests进阶:使用Session 为什么要用 Session? Session代表服务器与浏览器的一次会话过程,Session对象存储了特定用户会话所需的信息 例如:一定时间内记录账号密码 (自动登录) 可以加快 requests请求速度 需要客户端登录的

    2023年04月08日
    浏览(37)
  • 多线程知识点

    例如:一个短视频,一个线程复制管理视频,一个线程负责管理声音,一个线程负责管理弹幕 进程:Process,程序一旦开始运行就是是一个进程 线程:Thread,一个程序运行后,里面就包含了多个线程 真正的多线程是指有多个cpu,即多核。如果是模拟的多线程,即只有一个cpu,在

    2024年02月11日
    浏览(28)
  • 多线程面试相关知识点

    程序由指令和数据组成,但这些指令要运行,数据要读写,就必须将指令加载至CPU,数据加载至内存。在指令运行过程中还需要用到磁盘、网络等设备。进程就是用来加载指令、管理内存、管理 IO 的。 当一个程序被运行,从磁盘加载这个程序的代码至内存,这时就开启了一

    2024年02月08日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包