java多线程编程实例

Java多线程编程实例攻略

Java多线程编程使得程序可以同时运行多个任务,从而提高程序的效率,降低资源的浪费。本篇攻略将介绍Java多线程编程的基本概念、实例说明和注意事项。

多线程编程的基本概念

  • 进程(process):计算机中一个正在运行程序的实例。
  • 线程(thread):进程中负责执行任务的单个执行流程。每个进程可以拥有多个线程。
  • 并发:多个任务同时执行的情况。
  • 并行:多个任务同时执行,且每个任务在不同的处理器核心上运行的情况。

Java多线程编程的实现

Java多线程编程的实现可以通过两种方式:继承Thread类和实现Runnable接口。

继承Thread类

定义一个继承Thread类的子类,并重载类中的run()方法,这个run()方法中包含了线程执行的代码。

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

实现Runnable接口

定义一个实现Runnable接口的类,实现接口中的run()方法。

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

在主函数中启动线程:

Thread t = new Thread(new MyThread());
t.start();
MyRunnable m = new MyRunnable();
Thread t = new Thread(m);
t.start();

可以发现实现Runnable接口的方式有些繁琐,但却更具有灵活性,例如:

  1. 可以同时实现多个接口;
  2. 不需要通过继承Thread类来创建线程。

示例说明

示例1: 多线程下载文件

public class Main {
    static final int NUM_THREADS = 4;
    static final String[] urls = {
            "https://img-blog.csdn.net/20180507231500731",
            "https://img-blog.csdn.net/20180507231526681",
            "https://img-blog.csdn.net/20180507231613441",
            "https://img-blog.csdn.net/20180507231637775"
    };

    public static void main(String args[]) {
        ExecutorService executor = Executors.newFixedThreadPool(NUM_THREADS);
        for (int i = 0; i < NUM_THREADS; i++) {
            executor.execute(new Downloader(urls[i]));
        }
        executor.shutdown();
        while (!executor.isTerminated()) {
        }
        System.out.println("所有线程均已完成下载");
    }
}

class Downloader implements Runnable {
    private final String url;

    public Downloader(String url) {
        this.url = url;
    }

    public void run() {
        System.out.println("正在下载文件:" + url);
        try {
            URL u = new URL(url);
            InputStream in = u.openStream();
            byte[] buffer = new byte[1024];
            int len = 0;
            OutputStream out = new FileOutputStream(getFilename(u));
            while ((len = in.read(buffer)) > 0) {
                out.write(buffer, 0, len);
            }
            in.close();
            out.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        System.out.println("下载文件完成:" + url);
    }

    private String getFilename(URL u) {
        String filename = u.getPath();
        return filename.substring(filename.lastIndexOf('/') + 1);
    }
}

运行结果:

正在下载文件:https://img-blog.csdn.net/20180507231500731
正在下载文件:https://img-blog.csdn.net/20180507231637775
正在下载文件:https://img-blog.csdn.net/20180507231526681
正在下载文件:https://img-blog.csdn.net/20180507231613441
下载文件完成:https://img-blog.csdn.net/20180507231637775
下载文件完成:https://img-blog.csdn.net/20180507231613441
下载文件完成:https://img-blog.csdn.net/20180507231526681
下载文件完成:https://img-blog.csdn.net/20180507231500731
所有线程均已完成下载

示例2: 生产者 - 消费者模型

public class Main {
    public static void main(String args[]) {
        BlockingQueue<Integer> sharedQueue = new LinkedBlockingQueue<>();
        ExecutorService executor = Executors.newFixedThreadPool(2);
        executor.execute(new Producer(sharedQueue));
        executor.execute(new Consumer(sharedQueue));
        executor.shutdown();
        while (!executor.isTerminated()) {
        }
        System.out.println("所有线程均已完成任务");
    }
}

class Producer implements Runnable {
    private final BlockingQueue<Integer> sharedQueue;

    public Producer(BlockingQueue<Integer> sharedQueue) {
        this.sharedQueue = sharedQueue;
    }

    public void run() {
        for (int i = 1; i <= 10; i++) {
            try {
                sharedQueue.put(i);
                System.out.println("生产者生产:" + i);
                Thread.sleep(100);
            } catch (InterruptedException ex) {
                ex.printStackTrace();
            }
        }
    }
}

class Consumer implements Runnable {
    private final BlockingQueue<Integer> sharedQueue;

    public Consumer(BlockingQueue<Integer> sharedQueue) {
        this.sharedQueue = sharedQueue;
    }

    public void run() {
        while (true) {
            try {
                Integer value = sharedQueue.take();
                System.out.println("消费者消费:" + value);
                Thread.sleep(300);
            } catch (InterruptedException ex) {
                ex.printStackTrace();
            }
        }
    }
}

运行结果:

生产者生产:1
消费者消费:1
生产者生产:2
消费者消费:2
生产者生产:3
消费者消费:3
生产者生产:4
消费者消费:4
生产者生产:5
消费者消费:5
生产者生产:6
消费者消费:6
生产者生产:7
消费者消费:7
生产者生产:8
消费者消费:8
生产者生产:9
消费者消费:9
生产者生产:10
消费者消费:10

注意事项

  • 当多个线程操作共享对象时,可能会出现数据竞争和死锁的情况,需要通过线程同步来解决。
  • 在使用wait()和notify()函数时,必须要获得锁对象的所有权。
  • 通过使用线程池来管理线程可以提高程序的性能。
  • 程序中的睡眠时间、阻塞操作时间应当合理使用,否则可能会影响程序的响应性。

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

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

相关文章

  • Kotlin协程Job生命周期结构化并发详解

    下面是”Kotlin协程Job生命周期结构化并发详解”的完整攻略: Kotlin协程Job生命周期结构化并发详解 概述 Kotlin协程是一种非阻塞式的并发处理机制,它可以极大地简化并发编程。其中一个核心概念就是协程的Job,Job代表了协程的执行任务。在实际使用中,Job可以用来管理和控制协程的生命周期以及取消协程的执行。 本文将详细讲解Kotlin协程J…

    多线程 2023年5月17日
    00
  • C# 多线程编程技术基础知识入门

    以下是“C# 多线程编程技术基础知识入门”的完整攻略: 简介 C# 多线程编程技术是可以为我们应用程序带来突破性能瓶颈的好方式,可以利用多核 CPU 的优势提高程序效率。但是,多线程编程需要注意很多细节,需要我们对多线程编程有深入的了解和掌握,并且还需要特别注意线程之间的同步和通信。 基本概念 在多线程编程中,一个线程(Thread)是指一个程序执行流的基本…

    多线程 2023年5月17日
    00
  • 如何解决PHP无法实现多线程的问题

    如何解决PHP无法实现多线程的问题 对于PHP,由于其语言设计以及执行环境的限制,无法直接实现多线程。不过,可以采用一些方法进行模拟多线程的效果,比较常见的方法有使用PCNTL扩展以及Gearman扩展。以下是详细的解决方案说明。 PCNTL扩展 PCNTL扩展是PHP的一个系统扩展,主要用于实现对系统进程库的调用,通过调用系统的fork和exec机制,在一…

    多线程 2023年5月17日
    00
  • 在Go中构建并发TCP服务器

    针对“在Go中构建并发TCP服务器”的完整攻略,我为您提供以下内容: 1. 概述 在Go语言中,可以使用标准库net和net/http来轻松地构建TCP和HTTP服务器。在本文中,我们将介绍如何使用net库来构建并发TCP服务器。下面,将逐步介绍TCP服务器的实现步骤。 2. 步骤 步骤1:导入必要的包 既然我们要使用Go语言中的net库,因此在首个步骤中,…

    多线程 2023年5月17日
    00
  • Java多线程实战之交叉打印的两种方法

    下面是Java多线程实战之交叉打印的两种方法的完整攻略。 一、背景简介 在多线程编程中,经常需要使用交替打印字符串或数字,来实现功能的正确性和增强程序的趣味性。在Java中,可以使用lock,synchronized,wait和notify等多种机制来实现交替式打印的功能。本文介绍Java多线程实战中交替打印的两种方法。 二、方法一:使用Object.wai…

    多线程 2023年5月16日
    00
  • spring-boot 多线程并发定时任务的解决方案

    让我来为您详细讲解如何使用Spring Boot来实现多线程并发定时任务的解决方案。 1. 前言 Spring Boot是目前最流行的Java Web框架之一,而定时任务是后端应用中经常遇到的需求,如何在Spring Boot中高效地实现多线程并发定时任务呢? 传统的Java定时任务一般使用Timer或者ScheduledExecutorService来完成…

    多线程 2023年5月17日
    00
  • python并发场景锁的使用方法

    针对“python并发场景锁的使用方法”的完整攻略,我给您提供以下四个部分的内容: 一、什么是并发相关的锁? 并发相关的锁,是指一种机制,用于在多个线程或进程中,对一件共享资源进行访问时的互斥保护。在并发场景下,通常使用这种锁来避免竞态条件(race condition)和死锁(deadlock)等问题。Python的标准库提供了多个并发相关的锁,主要包括 …

    多线程 2023年5月17日
    00
  • 一文搞懂Java中的线程安全与线程同步

    一文搞懂Java中的线程安全与线程同步 什么是线程安全? 在多线程环境下,当多个线程同时访问同一个共享资源时,如果不加控制地修改该共享资源,就会出现线程安全问题。线程安全是指多个线程同时访问一个对象时,不会出现任何问题。 为了保证线程安全,可以采用线程同步机制,即对共享资源的访问进行控制。 什么是线程同步? 线程同步是指在并发编程中,为了保证多个线程对共享资…

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