首页 > 编程语言 >JAVA之多线程

JAVA之多线程

时间:2024-11-28 16:45:40浏览次数:8  
标签:Runnable run Thread start 线程 JAVA 多线程

什么是线程?
线程(Thread)是一个程序内部的一条执行流程。

什么是多线程?
多线程是指从软硬件上实现的多条执行流程的技术(多条线程由CPU负责调度执行)
如何创建多线程:
有两种方法可以创建新的执行线程。 一种是将类声明为Thread的子类。 此子类应覆盖类Thread的run方法。 然后可以分配和启动子类的实例(对象)。

多线程的创建方式一:继承Thread类

1.定义一个子类MyThread继承线程类java.lang.Thread,重写run()方法
2.创建MyThread类的对象
3.调用线程对象的start()方法启动线程(启动后还是执行run方法的)

优点:编码简单
缺点:线程类已经继承Thread,无法继承其他类,不利于功能的扩展。

public class MyThread extends Thread {
    // 重写run方法,定义线程执行的任务
    @Override
    public void run() {
        System.out.println("线程 " + Thread.currentThread().getName() + " 正在运行");
    }

    public static void main(String[] args) {
        // 创建线程对象
        MyThread thread1 = new MyThread();
        MyThread thread2 = new MyThread();

        // 设置线程名称
        thread1.setName("线程1");
        thread2.setName("线程2");

        // 启动线程
        thread1.start();
        thread2.start();
    }
}

注意事项
1.启动线程必须是调用start方法,不是调用run方法
直接调用run方法会当成普通方法执行,此时相当于还是单线程执行。
只有调用start方法才是启动一个新的线程执行。
2、不要把主线程任务放在启动子线程之前

多线程的创建方式一:实现Runnable接口创建多线程

步骤:
1.定义一个线程任务类MyRunnable实现Runnable接口,重写run()方法
2.创建MyRunnable任务对象
3.把MyRunnable任务对象交给Thread处理
4.调用线程对象的start()方法启动线程

优点:任务类只是实现接口,可以继续继承其他类、实现其他接口,扩展性强。
缺点:需要多一个Runnable对象。

public class MyRunnable implements Runnable {
    // 实现run方法,定义线程执行的任务
    @Override
    public void run() {
        //for循环50次
        for (int i = 0; i < 50; i++) {
            System.out.println("线程 " + Thread.currentThread().getName() + " 正在运行第"+i+"次");
        }
    }

    public static void main(String[] args) {
        // 创建Runnable对象
        Runnable myRunnable = new MyRunnable();

        // 创建Thread对象,并传入Runnable对象
        Thread thread1 = new Thread(myRunnable);
        Thread thread2 = new Thread(myRunnable);

        // 设置线程名称
        thread1.setName("线程1");
        thread2.setName("线程2");

        // 启动线程
        thread1.start();
        thread2.start();
    }
}

匿名内部类的创建方式:


public class MyRunnable  {
    // 实现run方法,定义线程执行的任务


    public static void main(String[] args) {

        // 创建Runnable对象
        Runnable myRunnable = new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < 50; i++) {
                    System.out.println("线程 " + Thread.currentThread().getName() + " 正在运行第"+i+"次");
                }
            }
        };

        // 创建Thread对象,并传入Runnable对象
        Thread thread1 = new Thread(myRunnable);
        Thread thread2 = new Thread(myRunnable);

        // 设置线程名称
        thread1.setName("线程1");
        thread2.setName("线程2");

        // 启动线程
        thread1.start();
        thread2.start();
    }
}

标签:Runnable,run,Thread,start,线程,JAVA,多线程
From: https://www.cnblogs.com/Eduhg/p/18572984

相关文章

  • 深入理解 Java 虚拟机-第一部分 走进 Java 笔记
    Sun/Oracle公司研发的热门虚拟机有三个:ClassicVM/ExactVM/HotSpotVMClassicVM:基于句柄(Handle)的对象查找方式,需要外挂JITExactVM:优于ClassicVM,使用了准确式内存管理(记录内存中存储的类型是地址还是数值),丢弃句柄,内置JIT,支持热点代码探测(通过计数器找出有......
  • java实现多线程读,单线程写
    多线程读,单线程写excel通过工厂模式,队列实现多线程读取(可以是文件,也可以是数据库),单线程向excel文件写;实现了一个线程出现问题其他线程同步中断。该实现逻辑的同时可以防止oom。  privatestaticfinalintINITIAL_CAPACITY=10;  privatestaticfinalintMAX_CA......
  • java 多线程同步方法CyclicBarrier/CountDownLatch/AtomicBoolean/Semaphore
    CyclicBarrier 有两个构造函数,CyclicBarrier(int),CyclicBarrier(int,Runnable)目的:通过输入任务数实现线程同步; 使用场景: 多线程计算:当多个线程需要分阶段并行处理数据,但在每一阶段结束时需要所有线程同步,以便开始下一阶段的处理。 并行任务协调:例如,在并行搜索或并行数......
  • JavaScript中的匿名函数
    JavaScript中的匿名函数是一种没有名称的函数,它们通常用于需要函数对象而不需要引用函数的场合。匿名函数可以在声明时立即调用,也可以作为参数传递给其他函数,或者赋值给变量。如何使用匿名函数1、立即执行函数表达式(IIFE):立即执行函数表达式是一种常见的匿名函数使用方式,它在定......
  • Q:CRON表达式,Linux和Java的不同写法
    CRON表达式是一个字符串,包含五个到七个由空格分隔的字段(每种软件不一样),表示一组时间,通常作为执行某个程序的时间表。调度精度:Linux的cron调度精度为分钟级别,最小粒度为分钟,而Java中的Quartz框架可以支持秒级别的调用。灵活性:Quartz框架提供了丰富的调度功能,可以支持一些复......
  • 多线程判断redis key导致Java hep space内存溢出
     线上经常发现报如下错误,后来发现rootcause是selectConfigitemforinstanceMap这个方法会查出几十万的结果集然后json压缩解压,写map等等操作,但是这个selectConfigitemforinstanceMap方法被很多地方调用到了,导致极有可能多线程同时都在查出几十万的结果集然后json压缩解压,写map等......
  • Javascript中的==与===
    在JavaScript中,==和===运算符用于比较两个值。==运算符被称为相等运算符(EqualityOperator)。它会比较两个值是否相等,但在比较之前会进行类型转换(如果两个值的类型不同)。如果两个值在类型转换后相等,则返回true。===运算符被称为严格相等运算符(StrictEqualityOperator)。它......
  • 前端技术对JavaScript的事件学习
    事件目录事件EventTarge接口事件模型Event对象事件类型EventTarge接口基本概念作用:EventTarget接口使得DOM元素和其他对象能够处理事件。通过该接口,可以绑定事件的监听函数,移除监听函数,以及触发事件。应用范围:不仅限于DOM节点,还包括一些需要事件通信的浏览器内置对象,如XMLH......
  • 医院分诊管理系统|Java|SSM|VUE| 前后端分离
    【重要1⃣️】前后端源码+万字文档+部署文档【重要2⃣️】正版源码有问题包售后【重要3⃣️】可复制品不支持退换货            【包含内容】【一】项目提供非常完整的源码注释【二】相关技术栈文档【三】源码讲解视频          ......
  • 生鲜食品o2o商城系统|Java|SSM|VUE| 前后端分离
    【重要1⃣️】前后端源码+万字文档+部署文档【重要2⃣️】正版源码有问题包售后【重要3⃣️】可复制品不支持退换货             【包含内容】【一】项目提供非常完整的源码注释【二】相关技术栈文档【三】源码讲解视频         ......