【Java线程与线程池】

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

Java线程与线程池


引言

Java是一门广泛应用于软件开发的高级编程语言,其多线程支持使得开发者能够利用多核处理器的优势,实现并发执行的程序。


目录

  1. 线程基础

    • 1.1 什么是线程
    • 1.2 线程的生命周期
    • 1.3 创建线程的方式
  2. 线程同步与通信

    • 2.1 线程同步
    • 2.2 线程通信
  3. Java线程池

    • 3.1 线程池的概念
    • 3.2 线程池的优势
    • 3.3 线程池的实现
    • 3.4 线程池的使用

1. 线程基础

1.1 什么是线程

线程是程序执行的最小单元,它是进程的一部分,一个进程可以包含多个线程。线程之间可以并发执行,共享进程的资源。线程的优势在于能够充分利用多核处理器,提高程序的执行效率。

1.2 线程的生命周期

Java线程的生命周期包括以下状态:

  • 新建(New):线程被创建但还未开始执行。
  • 运行(Runnable):线程正在执行或等待CPU时间片。
  • 阻塞(Blocked):线程等待某个条件的满足,在此状态下不会消耗CPU时间片。
  • 等待(Waiting):线程等待其他线程的通知,处于等待状态的线程可以被其他线程唤醒。
  • 超时等待(Timed Waiting):线程等待一段指定的时间后自动恢复运行。
  • 终止(Terminated):线程执行完毕或出现异常终止。

1.3 创建线程的方式

在Java中,有两种主要的方式来创建线程:

  • 继承Thread类:通过继承Thread类并重写run()方法来创建线程。
  • 实现Runnable接口:实现Runnable接口,并将其实例传递给Thread类的构造函数。

以下是使用继承Thread类和实现Runnable接口创建线程的示例代码:

// 使用继承Thread类创建线程
class MyThread extends Thread {
    public void run() {
        // 线程执行的代码
    }
}

// 使用实现Runnable接口创建线程
class MyRunnable implements Runnable {
    public void run() {
        // 线程执行的代码
    }
}

public class Main {
    public static void main(String[] args) {
        // 创建线程对象并启动线程
        MyThread thread1 = new MyThread();
        thread1.start();

        MyRunnable runnable = new MyRunnable();
        Thread thread2 = new Thread(runnable);
        thread2.start();
    }
}

2. 线程同步与通信

2.1 线程同步

多个线程访问共享资源时,可能会导致数据不一致或者竞态条件。为了避免这种情况,需要进行线程同步。

Java提供了关键字synchronizedvolatile来实现线程同步。synchronized关键字用于修饰方法或代码块,保证同一时刻只有一个线程执行被修饰的代码。volatile关键字用于修饰变量,保证变量的可见性,每次访问都从主内存中读取最新值。

以下是使用synchronized关键字实现线程同步的示例代码:

class Counter {
    private int count = 0;

    public synchronized void increment() {
        count++;
    }
}

public class Main {
    public static void main(String[] args) {
        Counter counter = new Counter();

        // 创建多个线程对计数器进行操作
        // ...

        // 等待所有线程执行完毕
        // ...
    }
}

2.2 线程通信

线程通信是指多个线程之间传递消息或共享数据的过程。Java提供了wait()notify()notifyAll()等方法来实现线程之间的通信。

  • wait()方法使线程进入等待状态,并释放锁资源。
  • notify()方法唤醒正在等待的线程中的一个线程。
  • notifyAll()方法唤醒正在等待的所有线程。

以下是使用线程通信实现生产者-消费者模型的示例代码:

class Buffer {
    private int data;
    private boolean available = false;

    public synchronized void produce(int newData) {
        while (available) {
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

        data = newData;
        available = true;
        notifyAll();
    }

    public synchronized int consume() {
        while (!available) {
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

        available = false;
        notifyAll();
        return data;
    }
}

public class Main {
    public static void main(String[] args) {
        Buffer buffer = new Buffer();

        // 创建生产者线程和消费者线程
        // ...

        // 等待所有线程执行完毕
        // ...
    }
}

3. Java线程池

3.1 线程池的概念

线程池是一种管理和复用线程的机制。它预先创建一组线程,并维护一个任务队列,用于存储待执行的任务。当有任务需要执行时,线程池会从任务队列中获取一个空闲线程来执行任务,执行完毕后线程会返回线程池以供重用。

3.2 线程池的优势

使用线程池有以下优势:

  • 降低线程创建和销毁的开销:线程的创建和销毁是比较昂贵的操作,使用线程池可以避免频繁创建和销毁线程,提高系统性能。
  • 控制并发线程数:线程池可以限制系统中并发线程的数量,防止过多的线程竞争导致系统资源耗尽。
  • 提供任务排队和调度机制:线程池可以管理任务队列,按照一定的策略调度任务执行,避免任务过载导致系统崩溃。

3.3 线程池的实现

Java提供了java.util.concurrent包下的Executor接口和ThreadPoolExecutor类来实现线程池。

Executor接口是线程池的顶层接口,定义了线程池的基本操作方法,如执行任务、关闭线程池等。

ThreadPoolExecutor类是Executor接口的实现类,提供了线程池的具体实现。可以通过构造函数指定线程池的核心线程数、最大线程数、任务队列等参数。

以下是创建线程池并执行任务的示例代码:

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class Main {
    public static void main(String[] args) {
        // 创建线程池
        ExecutorService executor = Executors.newFixedThreadPool(5);

        // 提交任务给线程池执行
        for (int i = 0; i < 10; i++) {
            executor.execute(new Task(i));
        }

        // 关闭线程池
        executor.shutdown();
    }

    static class Task implements Runnable {
        private int taskId;

        public Task(int taskId) {
            this.taskId = taskId;
        }

        public void run() {
            System.out.println("Task " + taskId + " is running.");
        }
    }
}

3.4 线程池的使用

使用线程池可以简化多线程编程,以下是线程池的常用操作:文章来源地址https://www.toymoban.com/news/detail-610000.html

  • 创建线程池:可以通过Executors类提供的工厂方法创建线程池,如newFixedThreadPool()newCachedThreadPool()等。
  • 提交任务:通过调用线程池的execute()方法或submit()方法,将任务提交给线程池执行。
  • 关闭线程池:在不再需要使用线程池时,应调用线程池的shutdown()方法来关闭线程池,释放资源。

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

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

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

相关文章

  • Java杂记————object.getClass()和object.class以及Java中的toString()方法的的区别

    (这里补充一下:Class类,它就是一个类,它将普通的类作为它的对象: 每个普通类都只有一个Class对象 普通类的Class对象用getClass()方法或者class来获取     比如    同时我们还可以延伸Field属性类,Constructor构造器类) 需要注意的是: 直接用print之类的函数输出一个对象会

    2024年02月11日
    浏览(44)
  • Java多线程开发系列之六:无限分解流----Fork/Join框架

    Fork译为拆分,Join译为合并 Fork/Join框架的思路是把一个非常巨大的任务,拆分成若然的小任务,再由小任务继续拆解。直至达到一个相对合理的任务粒度。然后执行获得结果,然后将这些小任务的结果汇总,生成大任务的结果, 直至汇总成最初巨大任务的结果。如下图: 红

    2024年02月08日
    浏览(35)
  • 开发语言漫谈-Java

            由于C++过于复杂,Java诞生了。与C++相比,Java更易于学习和使用,它去掉C++中的指针和解决了内存管理问题。Java提供了垃圾自动回收机制,自动管理不再使用的内存。Python又进一步简化,使得语法更简洁,更易于阅读和编写。当然随着简化,性能就越来越低。    

    2024年04月10日
    浏览(46)
  • 【JAVA开发面试】如何处理并发访问如何进行代码的单元测试Java多线程编程消息中间件设计模式技术难题是如何解决的

    【 点我-这里送书 】 本人详解 作者:王文峰,参加过 CSDN 2020年度博客之星,《Java王大师王天师》 公众号:JAVA开发王大师,专注于天道酬勤的 Java 开发问题 中国国学、传统文化和代码爱好者的程序人生,期待你的关注和支持!本人外号:神秘小峯 山峯 转载说明:务必注明

    2024年02月03日
    浏览(48)
  • 海康威视相机SDK二次开发(JAVA语言)

    前言 有个项目需要使用java程序读取海康威视的相机图片。相机通过以太网连接服务器,部署在服务器上的java程序将相机拍摄的画面保存在指定路径下。 海康威视提供了sdk开发包,可以在官网中下载,windows和linux系统都有。但是开发包中给出的示例代码,无法满足实际需要,

    2024年04月29日
    浏览(46)
  • 【Java】后端开发语言Java和C#,两者对比注解和属性的区别以及作用

    欢迎来到《小5讲堂》 大家好,我是全栈小5。 这是《Java》序列文章,每篇文章将以博主理解的角度展开讲解, 特别是针对知识点的概念进行叙说,大部分文章将会对这些概念进行实际例子验证,以此达到加深对知识点的理解和掌握。 温馨提示:博主能力有限,理解水平有限

    2024年01月16日
    浏览(51)
  • BsinCopilot:Java版端到端大语言模型开发框架

    BsinCopilot是基于BsinPaaS开源框架构建的大语言模型应用SaaS服务,借鉴langchain的框架思想,引入  langchian4j组件,微前端微服务的架构设计,可快速助您构建和体验端到端的AI应用。 概念 说明 Bsin 毕昇缩写,毕昇,中国北宋发明家,活字印刷术的发明者。毕昇出身平民,长期在

    2024年03月13日
    浏览(57)
  • Android 安卓开发语言kotlin与Java该如何选择

            如今在Android开发中,应用层开发语言主要是Java和Kotlin,Kotlin是后来加入的,主导的语言还是Java。kotlin的加入仿佛让会kotlin语言的开发者更屌一些,其实不然。         有人说kotlin的引入是解决开发者复杂的逻辑,并且对空指针控制的比较友好,但是我们在开

    2024年02月11日
    浏览(61)
  • Java转Go:java开发者转学go语言,请给我一些建议和学习推荐

    在做开发时遇到最无理的需求就是部门没了😂 遇到最无理的需求就是部门没了😂,差点人也在这个公司没了,但好在是跟着大部队换了一个部门,就是要转go,也可能要用js和solidity开发 一开始知道部门没了,第一时间一定是会担心,甚至后面知道有的同事要被毕业,有的同

    2024年02月13日
    浏览(50)
  • 【Java】学习一门开发语言,从TA的Hello World开始

    欢迎来到《小5讲堂》 大家好,我是全栈小5。 这是《Java》序列文章,每篇文章将以博主理解的角度展开讲解, 特别是针对知识点的概念进行叙说,大部分文章将会对这些概念进行实际例子验证,以此达到加深对知识点的理解和掌握。 温馨提示:博主能力有限,理解水平有限

    2024年01月23日
    浏览(53)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包