java中多线程

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


多线程

进程和线程

进程

进程:是正在运行的程序

  • 是系统进行资源分配和调用的独立单位

  • 每个进程都具有它自己的存储空间和系统资源

线程

线程:是进程中的单个顺序控制流,是一条执行路径

  • 单线程:一个进程如果只有一条执行路径,则称之为单线程程序

  • 多线程:一个进程如果有多条执行路径,则称之为多线程程序

继承Thread类方式实现多线程

  • 继承 Thread 类

  • 定义一个 MyThread 继承 Thread 类

  • 在 MyThread 类中重写 run() 方法

  • 创建 MyThread 类的对象

  • 启动线程

demo:

定义一个名字为MyThread的类继承Thread类,重新里面的run方法

package com.itxs.demo01;

/**
 * @Classname : MyThread
 * @Description : TODO 自定义线程 - 继承Thread类
 * @Author : lin_refuel@qq.com
 */
public class MyThread extends Thread {
    @Override
    // 当线程被启动时,会自动调用run方法
    public void run() {
        for (int i = 0; i < 20; i++) {
            System.out.println("i = " + i);
        }
    }
}

创建测试类demo01

package com.itxs.demo01;

/**
 * @Classname : demo01
 * @Description : TODO
 * @Author : lin_refuel@qq.com
 */
public class demo01 {
    public static void main(String[] args) {
         // 创建线程对象
        MyThread mt01 = new MyThread();
        MyThread mt02 = new MyThread();
        MyThread mt03 = new MyThread();
         // 通过start方法来启动多线程
        mt01.start();
        mt02.start();
        mt03.start();
    }
}

运行结果:每个线程里面都是执行三次循环,并没有顺序,而是谁抢到谁执行,
java中多线程,常用API - 03,java,python,开发语言

设置线程名字的两个方式

  1. 调用方法setName()来设置线程名字
  2. 通过构造方法来设置线程名字

demo:

自定义的线程类

package com.itxs.demo01;

/**
 * @Classname : MyThread
 * @Description : TODO 自定义线程 - 继承Thread类
 * @Author : lin_refuel@qq.com
 */
public class MyThread extends Thread {
    // 无参构造
    public MyThread() {
        super();
    }

    /**
     * 带参数构造,设置每个线程名字
     * @param name 名字
     */
    public MyThread(String name) {
        super(name);
    }

    @Override
    // 当线程被启动时,会自动调用run方法
    public void run() {
        for (int i = 0; i < 3; i++) {
            // this当前类,getName表示获取当前类的名字
            System.out.println(this.getName() + " i = " + i);
        }
    }
}

测试类demo01

package com.itxs.demo01;

/**
 * @Classname : demo01
 * @Description : TODO
 * @Author : lin_refuel@qq.com
 */
public class demo01 {
    public static void main(String[] args) {
         // 创建线程对象
        MyThread mt01 = new MyThread("线程01");
        MyThread mt02 = new MyThread("线程02");
        MyThread mt03 = new MyThread();
        // 设置每个线程的名字的方法setName();
//        mt01.setName("线程01");
//        mt02.setName("线程02");
        mt03.setName("线程03");
         // 通过start方法来启动多线程
        mt01.start();
        mt02.start();
        mt03.start();
    }
}

运行结果:
java中多线程,常用API - 03,java,python,开发语言

获取正在运行的线程

调用下面Thread类中方法,可以获取当前正在运行对象

Thread.currentThread()

main也是一个线程,设置main线程名字,没有办法通过this.getName和this.setName进行设置,只能通过上面的Thread类中方法进行设置获取

demo:

注意run方法中,输出每个线程名字的地方调用了Thread.currentThread()

package com.itxs.demo01;

/**
 * @Classname : MyThread
 * @Description : TODO 自定义线程 - 继承Thread类
 * @Author : lin_refuel@qq.com
 */
public class MyThread extends Thread {
    // 无参构造
    public MyThread() {
        super();
    }

    /**
     * 带参数构造,设置每个线程名字
     * @param name 名字
     */
    public MyThread(String name) {
        super(name);
    }

    @Override
    // 当线程被启动时,会自动调用run方法
    public void run() {
        for (int i = 0; i < 3; i++) {
            // this当前类,getName表示获取当前类的名字
           // System.out.println(this.getName() + " i = " + i);
             System.out.println(Thread.currentThread().getName() + " i = " + i);
        }
    }
}

测试类demo01: 注意main线程获取的

package com.itxs.demo01;

/**
 * @Classname : demo01
 * @Description : TODO
 * @Author : lin_refuel@qq.com
 */
public class demo01 {
    public static void main(String[] args) {
         // 创建线程对象
        MyThread mt01 = new MyThread("线程01");
        MyThread mt02 = new MyThread("线程02");
        MyThread mt03 = new MyThread();
        // 设置每个线程的名字的方法setName();
//        mt01.setName("线程01");
//        mt02.setName("线程02");
        mt03.setName("线程03");
         // 通过start方法来启动多线程
        mt01.start();
        mt02.start();
        mt03.start();
        // 获取正在运行的线程对象
        Thread.currentThread().setName("主线程");// 设置main线程名字
        for (int i = 0; i < 5; i++) {
            System.out.println(Thread.currentThread().getName() + "i = " + i);
        }
    }
}

运行结果:
java中多线程,常用API - 03,java,python,开发语言

线程调度模型和线程优先级设置

两种调度模型

  • 两种线程调度模型

    • 分时调度模型:所有线程轮流使用 CPU 的使用权,平均分配每个线程占用 CPU 的时间

    • 抢占调度模型:优先让优先级高的线程使用 CPU,如果线程的欧优先级相同,那么随机选择一个,优先级高的线程获取的 CPU 占用时间会相对多一些

    Java 使用的是抢占式的调度模型

优先级设置

Thread 类中设置和获取线程优先级的方法

 getPriority()//返回次线程的优先级
 setProiority()//更改次线程的优先级

demo:

创建一个名字为MyThread类继承Thread类

package com.itxs.demo01;

/**
 * @Classname : MyThread
 * @Description : TODO 自定义线程 - 继承Thread类
 * @Author : lin_refuel@qq.com
 */
public class MyThread extends Thread {
    // 无参构造
    public MyThread() {
        super();
    }

    /**
     * 带参数构造,设置每个线程名字
     * @param name 名字
     */
    public MyThread(String name) {
        super(name);
    }

    @Override
    // 当线程被启动时,会自动调用run方法
    public void run() {
        for (int i = 0; i < 50; i++) {
            // this当前类,getName表示获取当前类的名字
           // System.out.println(this.getName() + " i = " + i);
             System.out.println(Thread.currentThread().getName() + " i = " + i);
        }
    }
}

测试类demo02 - 查看优先级高的线程是否能更快执行完

package com.itxs.demo01;

/**
 * @Classname : demo02
 * @Description : TODO 线程优先级测试运行结果
 * @Author : lin_refuel@qq.com
 */
public class demo02 {
    public static void main(String[] args) {
         // 创建线程
        MyThread mt01 = new MyThread("线程01");
        MyThread mt02 = new MyThread("线程02");
        MyThread mt03 = new MyThread("线程03");
         // 设置每个线程优先级
        mt01.setPriority(Thread.MIN_PRIORITY);// 优先级低
        mt02.setPriority(Thread.NORM_PRIORITY);// 优先级不变
        mt03.setPriority(Thread.MAX_PRIORITY); // 优先级最高
        // 输出每个线程优先级
//        System.out.println(mt01.getPriority());//1
//        System.out.println(mt02.getPriority());//5
//        System.out.println(mt03.getPriority());//10
        // 开启线程
        mt01.start();
        mt02.start();
        mt03.start();
    }
}

运行结果: 线程mt03比其他两个线程运行快一点,仅仅一点

线程控制

sleep

sleep:使当前正在执行的线程停留指定的毫秒数

demo:案例:华山论剑

定义一个MyThread类继承Thread类

package com.itxs.demo02;

/**
 * @Classname : MyThread
 * @Description : TODO
 * @Author : lin_refuel@qq.com
 */
public class MyThread extends Thread {
    public MyThread() {
        super();
    }

    // 初始化线程名字的构造方法
    public MyThread(String name) {
        super(name);
    }

    @Override
    public void run() {
        for (int i = 1; i <= 20; i++) {
            System.out.println(Thread.currentThread().getName() + "打出了第" + i + "招");
            // 调用sleep使其线程执行一次循环后停留1秒
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

sleeptest测试类

package com.itxs.demo02;

/**
 * @Classname : sleepTest
 * @Description : TODO sleep测试类
 * @Author : lin_refuel@qq.com
 */
public class sleepTest {
    public static void main(String[] args) {
        // 创建线程对象
        MyThread mt01 = new MyThread("黄固");
        MyThread mt02 = new MyThread("欧阳锋");
        MyThread mt03 = new MyThread("段智兴");
        MyThread mt04 = new MyThread("洪七公");
        // 开启线程
        mt01.start();
        mt02.start();
        mt03.start();
        mt04.start();
    }
}

join

join:等待线程结束

package com.itxs.demo03;

/**
 * @Classname : MyThread
 * @Description : TODO 自定义线程类 - 继承Thread类
 * @Author : lin_refuel@qq.com
 */
public class MyThread extends Thread {
    public MyThread() {
        super();
    }
    // 设置线程名字
    public MyThread(String name) {
        super(name);
    }

    @Override
    public void run() {
        for (int i = 0; i < 5; i++) {
            System.out.println(Thread.currentThread().getName()+"报数:"+i);
        }
    }
}

test:测试类,注意join的使用,需要抛出异常

package com.itxs.demo03;

/**
 * @Classname : test
 * @Description : TODO
 * @Author : lin_refuel@qq.com
 */
public class test {
    public static void main(String[] args) throws InterruptedException {
         // 三个人报数,第一个人报完数后,其他人才能报数
        MyThread mt01 = new MyThread("1号");
        MyThread mt02 = new MyThread("2号");
        MyThread mt03 = new MyThread("3号");
        // 开始报数
        mt01.start();
        mt01.join();//等待第一个人报数完毕
        mt02.start();
        mt03.start();
    }
}

守护线程

setDaemon(boolean on)

将此线程标记为守护进程,当运行线程都是守护线程时,JVM 将退出

个人理解:主线程里面运行结束,守护线程不会继续执行

例子:老板带三个员工吃饭,老板吃饱后,员工不能继续吃了

demo:

定义MyThread类继承Thread类

package com.itxs.demo04;

/**
 * @Classname : MyThread
 * @Description : TODO
 * @Author : lin_refuel@qq.com
 */
public class MyThread extends Thread {
    public MyThread() {
        super();
    }

    // 设置线程对象名字
    public MyThread(String name) {
        super(name);
    }

    @Override
    public void run() {
        for (int i = 1; i <= 50; i++) {
            System.out.println(Thread.currentThread().getName() + "正在吃" + i + "口");
        }
    }
}

定义三个线程设置为守护线程,进行测试,注意守护线程设置方式

package com.itxs.demo04;

/**
 * @Classname : test
 * @Description : TODO
 * @Author : lin_refuel@qq.com
 */
public class test {
    public static void main(String[] args) {
        // 创建三个工人线程
        MyThread mt01 = new MyThread("1号工人");
        MyThread mt02 = new MyThread("1号工人");
        MyThread mt03 = new MyThread("1号工人");
        System.out.println("吃饭了");

        // 三个工人线程设置为守护线程,老板说吃饱了,工人就不继续吃了
        mt01.setDaemon(true);
        mt02.setDaemon(true);
        mt03.setDaemon(true);
        mt01.start();
        mt02.start();
        mt03.start();
        // 主线程:作为老板
        Thread.currentThread().setName("老板");
        for (int i = 1; i <5; i++) {
            System.out.println(Thread.currentThread().getName() + "正在吃第" + i + "口");
        }
        System.out.println("老板说吃饱了,咱们走吧");
    }
}

线程生命周期

  • 新建:创建线程对象(通过 start() 进入下一个环节)

  • 就绪:有执行资格,没有执行权(抢占 CPU 的执行权)

  • 运行:有执行资格,有执行权(可能被其他线程抢走 CPU 的执行权,则回到就绪状态,若遇到阻塞式方法,则失去运行权和执行这个,等待,当阻塞方法调用结束之后,回到就绪状态)

  • 死亡:线程死亡,成为垃圾文章来源地址https://www.toymoban.com/news/detail-796423.html

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

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

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

相关文章

  • Java/Python/Go不同开发语言在进程、线程和协程的设计差异

    在多线程项目开发时,最常用、最常遇到的问题是 1,线程、协程安全 2,线程、协程间的通信和控制 本文主要探讨不同开发语言go、java、python在进程、线程和协程上的设计和开发方式的异同。 进程 进程是 操作系统进行资源分配的基本单位,每个进程都有自己的独立内存空

    2024年01月23日
    浏览(37)
  • 【JAVAEE学习】探究Java中多线程的使用和重点及考点

    ˃͈꒵˂͈꒱ write in front ꒰˃͈꒵˂͈꒱ ʕ̯•͡˔•̯᷅ʔ大家好,我是xiaoxie.希望你看完之后,有不足之处请多多谅解,让我们一起共同进步૮₍❀ᴗ͈ . ᴗ͈ აxiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客 本文由xiaoxieʕ̯•͡˔•̯᷅ʔ 原创 CSDN 如需转载还请通知˶⍤⃝˶​ 个人主页:xiaoxieʕ̯

    2024年04月15日
    浏览(26)
  • java中多线程去跑海量数据使用线程池批量ThreadPoolExecutor处理的方式和使用Fork/Join框架的方式那种效率高?

    在Java中,使用线程池(ThreadPoolExecutor)和使用Fork/Join框架来处理海量数据的效率取决于具体的应用场景和需求。下面是一些需要考虑的因素: 任务类型:如果任务是CPU密集型的,那么使用Fork/Join框架可能更高效,因为它可以自动进行任务分割和并行处理。如果任务是I/O密集

    2024年02月10日
    浏览(38)
  • Qt 中多线程的使用

    在进行桌面应用程序开发的时候, 假设应用程序在某些情况下需要处理比较复杂的逻辑, 如果只有一个线程去处理,就会导致窗口卡顿,无法处理用户的相关操作。这种情况下就需要使用多线程,其中一个线程处理窗口事件,其他线程进行逻辑运算,多个线程各司其职,不

    2024年02月03日
    浏览(38)
  • Qt中多线程的使用

    在进行桌面应用程序开发的时候, 假设应用程序在某些情况下需要处理比较复杂的逻辑, 如果只有一个线程去处理,就会导致窗口卡顿,无法处理用户的相关操作。这种情况下就需要使用多线程,其中一个线程处理窗口事件,其他线程进行逻辑运算,多个线程各司其职,不

    2024年02月11日
    浏览(29)
  • C#中多线程Task详解

    参考文章: 添加链接描述 添加链接描述 添加链接描述 添加链接描述 添加链接描述 添加链接描述 添加链接描述 添加链接描述 添加链接描述 添加链接描述 添加链接描述 添加链接描述 1.1Thread方式 缺点:频繁的创建和消耗比较好资源;提供操作线程的API不是马上响应(线程是

    2024年02月04日
    浏览(30)
  • C# 中多线程锁的使用经验

    C# 中多线程锁的使用经验:全局锁,实例锁         private static object _exeLock = new object();        static 静态的是全应用程序的资源。如果在一个类里定义了这样一个锁,你在调用使用这个类的时候,是NEW了一个对象,并把这个对象给了一个静态全局变量中保存。这时这个锁

    2024年03月14日
    浏览(46)
  • 【多线程系列-03】深入理解java中线程的生命周期,任务调度

    多线程系列整体栏目 内容 链接地址 【一】深入理解进程、线程和CPU之间的关系 https://blog.csdn.net/zhenghuishengq/article/details/131714191 【二】java创建线程的方式到底有几种?(详解) https://blog.csdn.net/zhenghuishengq/article/details/127968166 【三】深入理解java中线程的生命周期,任务调度 ht

    2024年02月17日
    浏览(41)
  • 《Linux从练气到飞升》No.25 Linux中多线程概念

    🕺作者: 主页 我的专栏 C语言从0到1 探秘C++ 数据结构从0到1 探秘Linux 菜鸟刷题集 😘欢迎关注:👍点赞🙌收藏✍️留言 🏇 码字不易,你的👍点赞🙌收藏❤️关注对我真的很重要,有问题可在评论区提出,感谢阅读!!!

    2024年02月06日
    浏览(32)
  • chrome插件开发实例03-使用 chrome.storage API永久保存数据

    目录 防止数据丢失 使用chrome.storage API 功能 功能演示 源代码 manifest.json

    2024年02月14日
    浏览(25)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包