• Java多线程


    1.线程和进程的区别:

    线程具有许多传统进程所具有的特征,故又称为轻型进程(Light—Weight Process)或进程元;而把传统的进程称为重型进程(Heavy—Weight Process),它相当于只有一个线程的任务。在引入了线程的操作系统中,通常一个进程都有若干个线程,至少包含一个线程。

    根本区别:进程是操作系统资源分配的基本单位,而线程是处理器任务调度和执行的基本单位

    包含关系:如果一个进程内有多个线程,则执行过程不是一条线的,而是多条线(线程)共同完成的;线程是进程的一部分,所以线程也被称为轻权进程或者轻量级进程。

    内存分配:同一进程的线程共享本进程的地址空间和资源,而进程之间的地址空间和资源是相互独立的

    执行过程:每个独立的进程有程序运行的入口. 顺序执行序列和程序出口。但是线程不能独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制,两者均可并发执行

    线程的创建

    4种。

    1. 继承Thread类。

    public class MyThread extends Thread {
    
        public void run() {
            for(int i = 0; i < 10; i++) {
                System.out.println("MyThread"+getName());
            }
        }
    
    }
    public static void main(String[] args) throws InterruptedException {
        /**
         * 多线程的第一种启动方
         * 1.定义一个类继承Thread
         * 2.重写run方法
         * 3.创建子类对象启动线程
         */
        MyThread T1 = new MyThread();
        MyThread T2 = new MyThread();
        //开启线程.start()
        T1.setName("T1");
        T2.setName("T2");
    
        T1.start();
        T2.start();
    
    }
    1. 使用Runnable接口。

    public class Run implements Runnable{
        @Override
        public void run() {
            //实现线程要执行的代码
            for(int i = 0; i < 10; i++) {
                System.out.println("MyThread"+Thread.currentThread().getName()+"              "+i);
            }
        }
    }
    /**
     * 多线程的第二种启动方
     * 1.自己定义一个实现Runnable接口的类
     * 2.重写run方法
     * 3.创建自己的类
     * 4.创建一个Tread类对像开启多线程
     */
    
    //创建Run的对象
    //表示多线程要执行的人物
    
    
    public static void main(String[] args) {
    
        Run r = new Run();
    
        Thread t1 = new Thread(r);
        Thread t2 = new Thread(r);
        t1.start();
        t2.start();
    
    }
    1. 使用Callable接口。

    public class Mycallable implements Callable {
        @Override
        public Integer call() throws Exception {
            //求1~100d的和
            int sum = 0;
            for (int i = 1; i <= 100; i++) {
                sum += i;
            }
    
    
            return sum;
        }
    }
    1. 使用线程池技术。

    DiscardOldestPolicy:丢弃队列最前面的任务,然后重新提交被拒绝的任务。

    CallerRunsPolicy:由调用线程处理该任务。

    工作中核心线程数设置与CPU有关系,核心线程数=CPU数*2

    但是这样创建不够灵活,可以通过ThreadPoolExecutor去创建线程池,需要设置7个参数,分别是:

    1.核心线程池 2.最大线程数 3.空闲线程存活时间 4.存活时间单位 5.工作队列 6线程工厂 7.拒绝策略

    拒绝策略有4种:

    AbortPolicy:丢弃任务并且抛出异常。

    DiscardPolicy:丢弃任务但是不抛出异常。

    1. 可以通过Executors类提供的方法创建线程池,有4种创建的方法:

    2. 创建一个可以缓存的线程池。

    3. 创建一个定长的线程池。

    4. 创建一个定长的,支持定时任务、周期任务执行的线程池。

    5. 创建一个单线程池。

    工作中一般用线程池的方式来创建线程,方便线程的管理。比如SpringBoot中异步方式的执行,底层采用的就是线程池的方式。

    线程总共有5种状态:

    1. 新建状态:当线程对象创建后,进入新建状态。

    2. 就绪状态:当调用线程对象的start()方法时,进入就绪状态。

    3. 运行状态:当CPU开始调度就绪状态的线程时,进入运行状态。

    4. 堵塞状态:当运行的线程由于某些原因暂时放弃对CPU的使用权,进入堵塞状态。

    5. 死亡状态:当线程执行完毕或由于异常退出了run()方法,线程结束生命周期。

    堵塞的情况有3种:

    1. 等待阻塞:运行状态的线程执行了wait()方法。

    2. 同步阻塞:线程在获取sync锁的时候失败。(因为锁被其他线程占用)

    3. 其他阻塞:通过调用线程的sleep()或者join()或发出了I/O请求时。

  • 相关阅读:
    题解——二维费用背包问题(宠物小精灵之收服、潜水员)
    linux正则表达式
    pool = multiprocessing.Pool()报错:module object has no attribute Pool
    MLP神经网络,GRNN神经网络,SVM神经网络以及深度学习神经网络对比识别人体健康非健康数据
    [.NET/WPF] 设置按钮, 以及其他任何包含边框的控件的圆角
    390. 消除游戏
    Java匿名内部类解析
    3DTiles 1.0 数据规范详解[4.1] b3dm瓦片二进制数据文件结构
    【笔试强训选择题】Day47.习题(错题)解析
    Windows10计算机能升级到Windows 11 22H2吗?
  • 原文地址:https://blog.csdn.net/m0_53478905/article/details/132640993