Java基础之多线程

Java多线程的基础知识

在 Java 编程中,多线程是非常常见的技术,多线程的使用可以在提高程序并发性能的同时,也增加了程序的复杂度,因此学好多线程技术对于 Java 开发人员来说是非常重要的。

1. 创建线程

在 Java 中创建一个线程有两种主要方法:

1.1. 实现 Runnable 接口

Runnable 接口是 Java 多线程中的一个基本接口,通过实现 Runnable 接口并覆盖 run 方法实现多线程。

public class MyRunnable implements Runnable {
    @Override
    public void run() {
        System.out.println("当前线程名: " + Thread.currentThread().getName());
    }
}

然后,可以通过创建 Thread 对象并将其作为 Runnable 对象传递来创建线程。

MyRunnable myRunnable = new MyRunnable();
Thread thread = new Thread(myRunnable, "线程1");
thread.start();

1.2. 继承 Thread 类

继承 Thread 类是创建线程的另外一种方式,通过覆盖 run 方法实现多线程。

public class MyThread extends Thread {
    @Override
    public void run() {
        System.out.println("当前线程名: " + Thread.currentThread().getName());
    }
}

然后,可以直接创建 MyThread 的实例,并调用 start 方法来创建线程。

MyThread myThread = new MyThread();
myThread.setName("线程2");
myThread.start();

2. 线程同步

在多线程编程中,线程同步是一个非常关键的问题。当多个线程共享资源时,需要确保每个线程在访问共享资源时不会相互干扰。

2.1. 使用 synchronized 关键字

synchronized 关键字被用于控制并发访问临界区,只有获得了该锁的线程才可以进入临界区,其他线程需要等待锁的释放。

public class Counter {
    private int count;

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

    public synchronized void decrement() {
        count--;
    }

    public int getCount() {
        return count;
    }
}

2.2. 使用 Lock 接口

Lock 接口是 synchronized 关键字的替代品,它拥有更多的新增特性,能够提供更好的性能和可扩展性。

public class Counter {
    private int count;
    private final Lock lock = new ReentrantLock();

    public void increment() {
        lock.lock();
        try {
            count++;
        } finally {
            lock.unlock();
        }
    }

    public void decrement() {
        lock.lock();
        try {
            count--;
        } finally {
            lock.unlock();
        }
    }

    public int getCount() {
        return count;
    }
}

3. 示例说明

示例一

假设我们需要统计一个整数数组中所有元素的和,可以将数组分成若干个小块,然后每个线程负责计算每个小块的和,并将结果汇总起来。

public class ParallelSum {

    public static void main(String[] args) throws InterruptedException {
        int[] nums = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
        int numOfThreads = 3;

        ExecutorService executor = Executors.newFixedThreadPool(numOfThreads);

        List<Future<Integer>> list = new ArrayList<>();
        int chunkSize = nums.length / numOfThreads;

        for (int i = 0; i < nums.length; i += chunkSize) {
            int end = Math.min(nums.length, i+chunkSize);
            int[] part = Arrays.copyOfRange(nums, i, end);
            Callable<Integer> callable = new SumTask(part);
            Future<Integer> future = executor.submit(callable);
            list.add(future);
        }

        int totalSum = 0;
        for (Future<Integer> future : list) {
            totalSum += future.get();
        }

        executor.shutdown();

        System.out.println(totalSum);
    }

    static class SumTask implements Callable<Integer> {

        private int[] nums;

        public SumTask(int[] nums) {
            this.nums = nums;
        }

        @Override
        public Integer call() {
            int sum = 0;
            for (int num : nums) {
                sum += num;
            }
            return sum;
        }
    }
}

示例二

在下面的代码中,Task 类是一个在循环中执行 5 次以输出当前线程名的任务。使用线程池创建了 10 个线程 ThreadPoolExecutor,每个线程都将执行这个任务。

public class MultiThreading {

    public static void main(String[] args) {

        Runnable runnableTask = () -> {
            for (int i = 0; i < 5; i++) {
                System.out.println("线程名: " + Thread.currentThread().getName());
            }
        };

        ExecutorService executor = new ThreadPoolExecutor(
                5, //核心线程数
                10, //最大线程数
                1, //线程空闲时间
                TimeUnit.SECONDS, //时间单位
                new LinkedBlockingQueue<>() //任务队列
        );

        for (int i = 0; i < 10; i++) {
            executor.execute(runnableTask);
        }

        executor.shutdown();
    }
}

4. 小结

本文简要介绍了 Java 多线程的基础知识和线程同步问题,同时还给出了两个示例说明。多线程编程是 Java 编程中不可避免的一部分,通过本文的学习,相信读者已经对 Java 多线程有了深入的了解和实战经验。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java基础之多线程 - Python技术站

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

相关文章

  • python实现多线程行情抓取工具的方法

    以下是详细讲解“Python实现多线程行情抓取工具的方法”的完整攻略。 目录 需求说明 方案设计 操作步骤 示例说明 总结 需求说明 我们需要编写一个Python程序,能够从多个行情网站上抓取指定股票代码或名称的实时行情数据,并将其保存到本地文件。为了提高效率,我们需要使用多线程技术,同时抓取多个行情网站的数据。 方案设计 技术选型 为了实现多线程数据抓取,…

    多线程 2023年5月16日
    00
  • Java多线程并发编程 Synchronized关键字

    Java多线程并发编程Synchronized关键字 什么是Synchronized关键字? 在Java多线程并发编程中,Synchronized关键字可以用来保证多个线程在访问共享资源时的同步性。它可以实现线程安全的同步操作。 Synchronized关键字的用法 Synchronized关键字可以加在方法和代码块上面。 方法上的Synchronized关…

    多线程 2023年5月16日
    00
  • Go语言中的并发goroutine底层原理

    Go语言中的并发goroutine底层原理 背景 Go语言被称为互联网时代的C语言,因为它具有高效的并发能力,支持使用轻量级的goroutine进行并发编程。在Go语言中,每个goroutine都代表着一个独立的线程,但是它们可以在同一时间运行且共享内存,因此能够实现高效的并发编程。 goroutine的实现原理 Go语言的goroutine是基于M:N线程…

    多线程 2023年5月17日
    00
  • C#多线程Thread使用示例详解

    下面我将详细讲解“C#多线程Thread使用示例详解”的完整攻略。 C#多线程Thread使用示例详解 什么是多线程? 在计算机里,线程是一个可执行的代码片段。我们可以将线程视为一堆计算机程序指令。一个程序可以同时运行多个线程。多线程技术可以让计算机同时处理多项任务,从而更加高效。 如何使用多线程? 在C#中,可以使用Thread类来实现多线程技术。具体使用…

    多线程 2023年5月17日
    00
  • Java进阶之高并发核心Selector详解

    Java进阶之高并发核心Selector详解 什么是Selector Selector 是 Java NIO 中的一部分,它是一个可以通过单个线程处理多个 Channel 的组件。 在传统的 IO 模型中,每个连接都需要独立的线程进行处理,而使用 Selector 后,可以使用一个线程来处理多个连接,从而提高了程序的并发处理能力。 Selector 的使用 …

    多线程 2023年5月17日
    00
  • Android后台线程和UI线程通讯实例

    下面是关于Android后台线程和UI线程通讯实例的详细攻略。 什么是Android后台线程和UI线程通讯 Android应用开发中,我们常常需要在后台线程中执行一些耗时的操作,比如说网络请求或者复杂的计算任务。但是,在后台线程中我们是不能进行UI操作的。如果需要更新UI,我们就需要用到Android的线程通讯机制。Android提供了很多种线程通讯的方式,…

    多线程 2023年5月16日
    00
  • Java多线程的常用创建方式总结

    我们来讲解一下“Java多线程的常用创建方式总结”的完整攻略。 1. 概述 Java多线程是Java程序中一个非常重要的概念,它可以提高程序的运行效率,实现并发执行。在Java中,创建线程的方式有很多种,本文将总结和介绍几种常用的线程创建方式。 2. 继承Thread类 继承Thread类是Java多线程中最常用的一种创建方式。它主要通过继承Thread类来…

    多线程 2023年5月17日
    00
  • Java多线程 线程组原理及实例详解

    Java多线程 线程组原理及实例详解 什么是线程组 线程组是多线程编程中用来管理线程的一种手段,它可以帮助开发者更方便地对线程进行分组、统计信息、控制等操作。线程组通过ThreadGroup类进行实现。 线程组的创建 线程组的创建可以通过如下两种方式进行: 1.无参构造方法创建 ThreadGroup group = new ThreadGroup(&quo…

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