首页 > 编程语言 >Java多线程

Java多线程

时间:2024-08-28 20:50:22浏览次数:13  
标签:Java Thread start run 线程 Thread2 new 多线程

目录

1.进程和线程

2.并行与并发

3.多线程的实现

4.线程的生命周期

5.wait和sleep方法的区别

6.start和run方法的区别


1.进程和线程

进程(Process):可以看作程序的一次执行过程,是系统运行程序的基本单位

特点:

  • 独立性:进程是系统进行资源分配和调度的一个独立单元,各个进程之间互不干扰。
  • 动态性:进程是程序的一次执行过程,它有着创建、执行、暂停、终止等状态变化。
  • 并发性:多个进程可以在操作系统中并发执行,提高系统的资源利用率和吞吐量。

线程(Thread):进程可以进一步划分为线程,一个进程可以拥有多个线程,这些线程共享进程的资源(如内存、文件句柄等),但每个线程都有自己独立的执行流和堆栈。

特点:

  • 轻型性:与进程相比,线程的创建和销毁开销较小,切换速度也更快。
  • 共享性:线程间共享进程的内存空间和其他资源,使得线程间的通信更加高效。
  • 并发性:多个线程可以在同一进程中并发执行,提高程序的执行效率和响应速度。

2.并行与并发

并行(Parallelism):

并行是指多个程序或任务在同一时刻点,在多个处理器上同时执行。这意味着每个任务都拥有独立的处理器资源,可以真正地同时进行,而不需要等待其他任务完成。

并发(Concurrency):

并发是指在同一时间段内,多个程序或任务都在执行,但并不意味着它们在同一时刻都在执行。

并发是在同一时间段内多个任务交替执行,而并行是在同一时刻点上多个任务同时执行。

3.多线程的实现

1.基础Thread类

创建一个新的类,继承Thread类,并实现run()方法

    static class Thread1 extends Thread{
        private String name;

        public Thread1(String name){
            this.name = name;
        }

        public void run(){
            for (int i = 0; i < 3; i++) {
                System.out.println(name + i);
                try {

                    //使当前线程暂停300ms,使其他线程运行
                    sleep(300);

                } catch (InterruptedException e) {

                    //如果在等待过程中被中断,则会抛出异常
                    throw new RuntimeException(e);

                }
            }
        }
    }

    public static void main(String[] args) {
        //创建两个线程实例
        Thread1 thread1 = new Thread1("A");
        Thread1 thread2 = new Thread1("B");

        //运行
        thread1.start();
        thread2.start();

    }

2.实现Runnable接口

创建一个新的类,实现Runnable接口,并实现run()方法

    public static void main(String[] args) {
        //创建两个Thread2的实例
        Thread2 thread1 = new Thread2("A");
        Thread2 thread2 = new Thread2("B");

        //创建两个Thread实例,并将上面创建的Thread2的实例作为参数传递给Thread
        //每个Thread实例执行Runnable任务中的run方法
        Thread thread11 = new Thread(thread1);
        Thread thread22 = new Thread(thread2);

        thread11.start();
        thread22.start();
    }

    static class Thread2 implements Runnable{
        private String name;

        public Thread2(String name){
            this.name = name;
        }

        //重写run方法
        @Override
        public void run() {
            for (int i = 0; i < 3; i++) {
                System.out.println(name + i);
                try {
                    sleep(300);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            }
        }
    }

4.线程的生命周期

  1. 新建状态:新创建了一个线程对象
  2. 就绪状态:线程对象调用了start方法,该线程已具备了运行的条件
  3. 运行状态:线程获得了时间片时,进入运行状态
  4. 阻塞状态:在运行过程中,由于某些原因可能会进入阻塞状态,在该状态下,线程将不会进行任何操作,直到该状态解除
  5. 死亡状态:线程执行完毕,或因异常退出执行,结束生命周期

5.wait和sleep方法的区别

1.唤醒机制:

  • wait():在没有设置最大时间的情况下,必须等待其他线程调用同一对象的 notity() 或 notifyAll()方法来唤醒
  • sleep():让线程休眠到一定时间后自动继续运行

2.锁机制:

  • wait():调用该方法的对象必须持有对象的锁(即必须在同步方法或同步块中调用),调用该方法后会释放对象的锁并进入等待状态
  • sleep():只会让进程进行休眠,让出cpu资源,不会释放任何锁

6.start和run方法的区别

1.方法功能:

  • start():不会直接执行run()方法,而是使线程进入就绪状态,等待调度
  • run():代码逻辑在该方法中实现,当线程执行时,会自动调用该方法

2.执行方式:

  • start():创建一个新线程,并在新进程中调用run方法,实现多线程的并发执行
  • run():按顺序执行,不会实现多线程的并发
    //调用start方法
    public static void main(String[] args) {
        Thread2 thread1 = new Thread2("A");
        Thread2 thread2 = new Thread2("B");

        Thread thread11 = new Thread(thread1);
        Thread thread22 = new Thread(thread2);

        thread11.start();
        thread22.start();
    }

 输出结果:B0 A0 B1 A1 B2 A2

    //调用run方法
    public static void main(String[] args) {
        Thread2 thread1 = new Thread2("A");
        Thread2 thread2 = new Thread2("B");

        Thread thread11 = new Thread(thread1);
        Thread thread22 = new Thread(thread2);

        thread11.run();
        thread22.run();
    }

输出结果:A0 A1 A2 B0 B1 B2

标签:Java,Thread,start,run,线程,Thread2,new,多线程
From: https://blog.csdn.net/zhaogx233/article/details/141503510

相关文章

  • Java集合之Map
    Map<Key,Value> Map映射的特点Map集合(无序)的数据结构实现只针对键有效,与值无关。存储的是键值对形式的元素,键唯一,值可以重复一个映射不能包含重复的键;每个键最多只能映射到一个值Map<K,V>:K和V表示泛型,map的key和value可以是任意类型(基本数据类型除外),实际项目中K一般都是字......
  • 华为java岗经典面试题解析
    题目为在一个整形的数组中,在数组中只有一值个是不重复的,其他的值都是有两个重复的值,找出不重复的那个值。{11,11,12,13,13,16,16}解析为当用Java来解决这个问题时,可以使用异或运算来找出只出现一次的元素。以下是一个示例Java程序,演示了如何在一个整型数组中找出只出现一次的元......
  • 【CUDA编程笔记】如何使用CUDA统一内存来优化多进程多线程程序的性能?
    如何使用CUDA统一内存来优化多进程多线程程序的性能?要使用CUDA统一内存优化多进程多线程程序的性能,可以采取以下步骤。理解统一内存统一内存是CUDA编程模型的一个组件,它定义了一个所有处理器都可访问的单一连贯内存映像,允许数据在CPU和GPU之间透明迁移,无需显式复制。使......
  • cs61b-java
    java类和函数下面两端代码定义在dog类中,所不同的是一个是静态方法,一个是非静态方法。publicstaticvoidmakenoise(){ System.out.println("bark!");}publicvoidmakethenoise(){ if(weight<10) { System.out.println("wuwuwu!"); } elesif(weight<30) { Syst......
  • JavaEE-TCP协议
    上篇文章介绍了TCP可靠传输主要依靠的确认应答和超时重传机制,超时重传是确认应答的重要补充,还介绍了TCP的连接管理机制。本篇文章补充上一篇文章的TCP十个常用核心机制的其他七个。目录滑动窗口窗口大小流量控制拥塞控制延时应答捎带应答面向字节流异常情况 滑动......
  • 系统编程-多线程1
    多线程1目录多线程1引入认识线程1、线程的概念2、线程的优缺点3、进程和线程的区别和联系4、什么时候选进程,什么时候选线程?线程相关函数1、创建线程2、线程的退出函数3、阻塞等待线程退出并回收资源4、获取自身线程号的函数5、主动取消一个线程6、注册线程退出......
  • java+vue计算机毕设物业信息管理系统【源码+开题+论文】
    本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着城市化进程的加速和居民生活水平的提高,物业管理作为现代社区管理的重要组成部分,其复杂性和重要性日益凸显。传统的人工物业管理方式已难以满足当......
  • java+vue计算机毕设同城跑腿平台【源码+开题+论文】
    本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着互联网技术的飞速发展和人们生活节奏的加快,同城服务需求日益增长,特别是在快节奏的城市生活中,人们对于即时、便捷的服务需求愈发强烈。传统的快递......
  • java+vue计算机毕设图书馆自习室管理系统【源码+开题+论文】
    本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着高等教育的普及与知识经济的蓬勃发展,图书馆作为知识传播与学术交流的重要场所,其服务功能日益多元化与精细化。近年来,图书馆自习室因其安静的学习......
  • javascript(js)入门指南
    JavaScript常用知识点全面指南1.变量声明在JavaScript中,变量用于存储数据。你可以使用var、let或const来声明变量。var:早期使用的变量声明方式,有函数作用域。声明的变量可以在其所在的函数内任何地方访问,存在变量提升。varx=10;let:推荐的声明方式,有块级......