java简单实现多线程及线程池实例详解

关于 "java简单实现多线程及线程池实例详解" 的攻略,下面是完整的讲解,分为以下几个部分:

1. 多线程的基本概念

1.1 什么是多线程

多线程,就是在一个程序中有多个线程同时执行,每个线程拥有自己的栈、局部变量等,但是共享同一进程的内存空间和全局变量。

1.2 多线程的优点

多线程可以提高程序的并发性,改善用户体验。同时,多线程还可以充分利用多核 CPU 的优势,提高程序的执行效率。

2. Java 实现多线程的方法

2.1 继承 Thread 类

继承 Thread 类是最基本的实现多线程的方法,在 Java 中,每个线程都是通过 Thread 类的对象实现的。

class MyThread extends Thread {
    public void run(){
        // 这里是线程执行的代码
    }
}

2.2 实现 Runnable 接口

Java 中还有另外一种实现多线程的方法,就是实现 Runnable 接口。

class MyRunnable implements Runnable{
    public void run() {
        // 这里是线程执行的代码
    }
}

2.3 创建线程并启动线程

在 Java 中启动线程是通过调用 start() 方法来实现的,当 start() 方法被调用时,线程会进入就绪状态,等待 CPU 调度,并开始执行线程的 run() 方法。

MyThread thread = new MyThread();
thread.start();

MyRunnable runnable = new MyRunnable();
Thread thread = new Thread(runnable);
thread.start();

3. 线程池的概念

3.1 什么是线程池

线程池就是预先创建一定数量的线程,这些线程统一由线程池管理,任务到来时,线程池中的线程会自动分配任务并执行。

3.2 线程池的优点

线程池可以避免线程的过度创建和销毁,减少系统资源的浪费,以及提高了代码的可维护性。

3.3 线程池的组成

线程池由三部分组成:工作队列、线程池管理器、线程池。

4. Java 实现线程池的方法

4.1 创建一个线程池

ThreadPoolExecutor pool = 
    new ThreadPoolExecutor(
        nThreads, // 核心线程数
        maxThreads, // 最大线程数
        keepAliveTime, // 非核心线程数的存活时间
        TimeUnit.MILLISECONDS, // 存活时间单位
        new LinkedBlockingQueue<Runnable>(), // 工作队列
        Executors.defaultThreadFactory(), // 线程工厂
        new ThreadPoolExecutor.AbortPolicy()); // 拒绝策略

4.2 向线程池提交任务

pool.execute(new MyRunnable());

4.3 关闭线程池

pool.shutdown();

5. 示例说明

5.1 实现多线程计算累加和

class MyThread extends Thread {
    private int sum = 0;

    public int getSum() {
        return sum;
    }

    public void run(){
        for(int i=1;i<=100;i++){
            sum += i;
        }
    }
}

public class Main {
    public static void main(String[] args) throws InterruptedException {
        MyThread t1 = new MyThread();
        MyThread t2 = new MyThread();
        t1.start();
        t2.start();
        t1.join();
        t2.join();
        int sum = t1.getSum() + t2.getSum();
        System.out.println("sum = " + sum);
    }
}

5.2 实现线程池下载图片

public class Main {
    public static void main(String[] args) {
        ThreadPoolExecutor pool = new ThreadPoolExecutor(
                4,  // 核心线程数为4
                8,  // 最大线程数为8
                5,  // 非核心线程的存活时间为5毫秒
                TimeUnit.MILLISECONDS, // 存活时间的时间单位为毫秒
                new LinkedBlockingQueue<Runnable>(), // 设置任务队列为LinkedBlockingQueue
                Executors.defaultThreadFactory(), // 设置线程工厂
                new ThreadPoolExecutor.AbortPolicy()); // 设置拒绝策略

        String[] urls = {
                "https://www.baidu.com/img/flexible/logo/pc/result.png",
                "https://www.baidu.com/img/flexible/logo/pc/result.png",
                "https://www.baidu.com/img/flexible/logo/pc/result.png",
                "https://www.baidu.com/img/flexible/logo/pc/result.png",
                "https://www.baidu.com/img/flexible/logo/pc/result.png",
                "https://www.baidu.com/img/flexible/logo/pc/result.png",
                "https://www.baidu.com/img/flexible/logo/pc/result.png",
                "https://www.baidu.com/img/flexible/logo/pc/result.png"
        };

        for (String url : urls) {
            pool.execute(() -> {
                downloadImage(url);
            });
        }

        pool.shutdown();
    }

    private static void downloadImage(String url) {
        try {
            URL u = new URL(url);
            HttpURLConnection conn = (HttpURLConnection) u.openConnection();
            InputStream stream = conn.getInputStream();
            File file = new File("image_" + System.currentTimeMillis() + ".png");
            FileOutputStream fos = new FileOutputStream(file);
            byte[] buffer = new byte[1024];
            int len = -1;
            while ((len = stream.read(buffer)) != -1) {
                fos.write(buffer, 0, len);
            }
            fos.flush();
            fos.close();
            stream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java简单实现多线程及线程池实例详解 - Python技术站

(0)
上一篇 2023年5月17日
下一篇 2023年5月17日

相关文章

  • AQS同步组件Semaphore信号量案例剖析

    下面详细讲解“AQS同步组件Semaphore信号量案例剖析”的完整攻略。 什么是Semaphore信号量? Semaphore信号量是AQS同步组件的一种,它允许多线程在同一时刻访问某个资源,但是要限制同时访问的线程数量。Semaphore的作用就相当于一个门卫,只允许一定数量的人进入资源区域,其他人就需要等待。 Semaphore构造方法:Semapho…

    多线程 2023年5月17日
    00
  • Java高并发之CyclicBarrier的用法详解

    Java高并发之CyclicBarrier的用法详解 CyclicBarrier是什么? CyclicBarrier是Java并发工具包中核心类之一,它的作用是让多个线程在执行时实现同步,等待大家都准备好之后再一起执行。与CountDownLatch类似,CyclicBarrier也可以用于控制线程的执行顺序,但是不同的是,CyclicBarrier可以让多…

    多线程 2023年5月16日
    00
  • springboot内置的tomcat支持最大的并发量问题

    当使用Spring Boot时,自带Tomcat作为默认的Web服务器,但Tomcat的并发限制可能会在某些情况下成为瓶颈。在这里,我们将讲解如何配置Tomcat以支持更大的并发量。 1. 增加Tomcat的线程数 默认情况下,Spring Boot内置的Tomcat服务器使用200个线程作为最大并发数。如果需要更多的并发请求可以使用以下方式增加Tomcat…

    多线程 2023年5月17日
    00
  • Java面试题冲刺第二十五天–并发编程3

    Java面试题冲刺第二十五天–并发编程3主要包含了以下知识点: 并发中的线程调度机制 Java中多线程编程的5种状态,如何通过编码实现状态间的转换 Java中如何使用wait()、notify()和notifyAll()方法控制线程等待和唤醒 Java中如何使用Lock、Condition和ReentrantLock实现线程同步 以下是对这些知识点的详细讲…

    多线程 2023年5月17日
    00
  • Java多线程ForkJoinPool实例详解

    Java多线程ForkJoinPool实例详解 什么是ForkJoinPool? ForkJoinPool是Java7中新增的并发框架,是一个专为执行大规模任务而设计的线程池,它可以把一个大任务拆分成多个小任务并行处理,最终将所有小任务的结果合并起来,得到最终的执行结果。 ForkJoinPool的基本用法 ForkJoinPool的使用类似于Java中的E…

    多线程 2023年5月16日
    00
  • Go语言并发技术详解

    Go语言并发技术详解攻略 为什么要学习Go语言并发技术 Go语言是一款天生支持并发的编程语言,其强大的并发特性可以有效提升程序运行效率和性能。并发技术在现代化的应用程式中越来越重要,尤其是在大规模分布式系统中,用Go编写的应用程序往往能更好地处理高并发情况,提高系统的稳定性和可靠性。因此,学习Go语言并发技术对于Web开发、数据处理、高性能计算等领域的开发人…

    多线程 2023年5月16日
    00
  • .net面向对象之多线程(Multithreading)及 多线程高级应用

    .NET面向对象之多线程(Multithreading) 多线程概念 多线程是在单个程序里同时执行多个不同的流程的方式。在传统的单线程模式下,一个程序只能按顺序逐一执行操作,即使某些操作可以同时进行,也只能一个接一个地执行。而使用多线程可以在同一进程内同时执行多个流程,以提高程序的效率和用户体验度。 多线程的优点 多线程使得程序流程更加灵活,能够简化程序的逻…

    多线程 2023年5月16日
    00
  • Java常见面试题之多线程和高并发详解

    Java常见面试题之多线程和高并发详解 简介 在Java的面试中,多线程和高并发是一个经常被问到的话题。因此,对于这个话题,我们必须掌握一些基本概念和技术来进行面试表现。 多线程和高并发的概念 多线程:在同一个程序中,多个线程能够共享同一个地址空间和文件描述符等类似的全局变量,允许并行运行多个线程。 高并发:指在同一时间内,有很多用户同时访问同一个资源,例如…

    多线程 2023年5月16日
    00
合作推广
合作推广
分享本页
返回顶部