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日

相关文章

  • python基于concurrent模块实现多线程

    下面就让我来为你详细讲解Python基于concurrent模块实现多线程的完整攻略。 什么是concurrent模块 concurrent模块是Python标准库中提供的一个用于编写并发代码的模块,它包含了多种并发编程的工具和方法,其中包括了线程、进程、协程等。在本文中,我们将主要讲解如何使用concurrent模块实现多线程编程。 如何使用concurr…

    多线程 2023年5月17日
    00
  • Ruby多线程编程初步入门

    Ruby多线程编程初步入门攻略 什么是多线程 多线程是指在同一个程序中运行多个线程(thread)。每个线程具有独立的运行路径,多个线程可以同时运行。 在多核 CPU 中,多线程可以充分利用 CPU 资源,提高程序的执行效率。 Ruby中的线程 在 Ruby 中,我们可以通过 Thread 类来创建线程。 比如,下面的例子中,我们创建了两个线程,分别输出不同…

    多线程 2023年5月17日
    00
  • C++基于reactor的服务器百万并发实现与讲解

    C++基于Reactor的服务器百万并发实现与讲解 简介 该攻略将介绍基于Reactor模式实现高并发服务器的过程。Reactor模式是一种常见的多路复用I/O技术,用于实现高并发环境下的网络服务器。Reactor模式基于IO多路复用,通过事件驱动的方式,将网络I/O事件分发给对应的处理函数,从而实现高效的I/O操作。 本攻略将着重介绍基于C++实现Reac…

    多线程 2023年5月17日
    00
  • 从并发到并行解析Go语言中的sync.WaitGroup

    从并发到并行解析Go语言中的sync.WaitGroup是一篇介绍Go语言中并发编程工具的文章。在该篇文章中,我们会深入了解到什么是并发和并行,以及如何使用sync.WaitGroup来协调并发和并行工作。 并发和并行的定义 并发是指同时执行多个代码段,但并不保证这些代码段的执行顺序。一个被操作系统调度器管理的Go程序就是一个并发程序。 并行是指同时执行多个…

    多线程 2023年5月16日
    00
  • Python中多线程thread与threading的实现方法

    Python提供了两个模块来实现多线程,分别是thread和threading。其中,thread是低级模块,它提供了基本的线程功能。而threading是高级模块,它借鉴了Java中线程的概念,提供了更加高级、更加便捷的线程管理方式。下面分别介绍这两个模块的实现方法。 thread模块的实现方法 线程的创建 使用thread模块创建线程的方法很简单,只需要…

    多线程 2023年5月17日
    00
  • Tomcat使用线程池处理远程并发请求的方法

    下面我将提供完整的攻略,包括Tomcat使用线程池处理远程并发请求的原理、具体的实现方法以及两个示例说明。 1. 原理 Tomcat使用线程池处理远程并发请求的原理是:Tomcat在启动时会初始化一个线程池,用于处理客户端的请求。当有新的客户端请求到达时,Tomcat会从线程池中获取一个可用的线程来处理请求。如果线程池中所有线程都在忙碌状态,新的请求将会进入…

    多线程 2023年5月16日
    00
  • java并发学习-CountDownLatch实现原理全面讲解

    Java并发学习-CountDownLatch实现原理全面讲解 在Java的并发编程中,有一个常见的工具类叫做CountDownLatch,用于等待一组线程完成它们的工作。本文将对CountDownLatch的原理进行全面讲解,包括它的实现原理、应用场景以及示例代码。 1. CountDownLatch的实现原理 CountDownLatch的实现原理非常简…

    多线程 2023年5月17日
    00
  • python 包之 threading 多线程

    首先,我们来介绍一下什么是 Python 的 threading 包。 Python 的 threading 包提供了对线程操作的支持。线程表示一个独立的控制流,它允许我们同时执行多个流程。对于 Python 程序,即使没有手动创建过线程,也会默认有一个主线程,它会在程序启动时自动创建。同时,Python 还提供了一些库函数,可以在任意时刻操作线程。 下面,…

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