Java多线程并发执行demo代码实例

请看以下内容。

Java多线程并发执行demo代码实例

介绍

Java多线程编程是Java编程中一个非常重要的话题,当我们需要进行大量或者耗时的计算操作时,多线程并发执行可以提高程序的运行效率。而Java的线程机制使得多线程编程变得简单易用。

本篇文章主要通过示例讲解Java多线程的基本概念和使用方法。

创建线程

Java中创建线程有两种方式:一种是继承Thread类,一种是实现Runnable接口。

继承Thread类

使用这种方式需要重写run()方法,将需要执行的代码放入其中,并通过start()方法启动线程。

示例代码:

public class MyThread extends Thread {
    public void run() {
        System.out.println("线程" + Thread.currentThread().getName() + "正在执行");
    }
}

在主方法中创建并启动线程:

public class Test {
    public static void main(String[] args) {
        for (int i = 0; i < 5; i++) {
            MyThread thread = new MyThread();
            thread.start();
        }
    }
}

实现Runnable接口

使用这种方式需要实现run()方法,将需要执行的代码放入其中,并通过new Thread(Runnable r).start()方法启动线程。

示例代码:

public class MyRunnable implements Runnable {
    public void run() {
        System.out.println("线程" + Thread.currentThread().getName() + "正在执行");
    }
}

在主方法中创建并启动线程:

public class Test {
    public static void main(String[] args) {
        for (int i = 0; i < 5; i++) {
            MyRunnable runnable = new MyRunnable();
            new Thread(runnable).start();
        }
    }
}

Callable和Future

Java5以后,新增了一种创建线程的方式:实现Callable接口并返回结果,通过FutureTask来包装Callable对象。可以通过FutureTask的get()方法获取返回结果。

示例代码:

public class MyCallable implements Callable<String> {
    public String call() throws Exception {
        return "线程" + Thread.currentThread().getName() + "正在执行";
    }
}

在主方法中创建并启动线程:

public class Test {
    public static void main(String[] args) throws Exception {
        MyCallable callable = new MyCallable();
        FutureTask<String> futureTask = new FutureTask<>(callable);
        new Thread(futureTask).start();
        System.out.println(futureTask.get());
    }
}

线程状态

Java中的线程有6个状态:New、Runnable、Blocked、Waiting、Timed Waiting、Terminated。

New

当线程对象被创建时,它处于New状态。

Thread thread = new Thread();

Runnable

当调用线程对象的start()方法后,线程处于Runnable状态,表示它可以运行。

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

Blocked

当线程处于Blocked状态时,它被阻塞,等待另一个线程释放一个锁或者执行完毕。

synchronized(obj) {
    // 这里代码执行时,线程处于Blocked状态
}

Waiting

当线程处于Waiting状态时,它正在等待另一个线程执行某些操作。

synchronized(obj) {
    obj.wait(); // 这里代码执行时,线程处于Waiting状态
}

Timed Waiting

当线程处于Timed Waiting状态时,它正在等待另一个线程执行某些操作,但是有超时时间。

synchronized(obj) {
    obj.wait(timeout); // 这里代码执行时,线程处于Timed Waiting状态
}

Terminated

当线程完成了工作或者发生了异常,它进入Terminated状态。

示例说明

以下是一个使用多线程并发执行的示例:

我们需要统计一个Array中所有偶数的和。

单线程统计

首先我们来看单线程统计的代码:

public int sum(int[] nums) {
    int result = 0;
    for (int num : nums) {
        if (num % 2 == 0) {
            result += num;
        }
    }
    return result;
}

多线程统计

使用多线程,我们可以将Array拆成多个部分交给多个线程进行处理,然后汇总结果即可。以下是示例代码:

public int sum(int[] nums) throws InterruptedException {
    int numThreads = Runtime.getRuntime().availableProcessors(); // 获取可用的处理器个数
    int step = nums.length / numThreads;
    List<Thread> threads = new ArrayList<Thread>(numThreads);
    List<Integer> results = new ArrayList<Integer>(numThreads);
    for (int i = 0; i < numThreads; i++) {
        final int start = i * step;
        final int end = (i == numThreads - 1) ? nums.length : (i + 1) * step;
        Thread thread = new Thread(new Runnable() {
            public void run() {
                int result = 0;
                for (int j = start; j < end; j++) {
                    if (nums[j] % 2 == 0) {
                        result += nums[j];
                    }
                }
                results.add(result);
            }
        });
        threads.add(thread);
        thread.start();
    }
    for (Thread thread : threads) {
        thread.join(); // 等待所有线程执行完毕
    }
    int result = 0;
    for (Integer i : results) {
        result += i;
    }
    return result;
}

上面的代码将Array拆成numThreads个部分,每个部分对应一个线程,每个线程统计自己对应部分的偶数和,然后把结果保存在results列表中。最后再将results列表的结果汇总计算得到最终结果。

以上示例说明了多线程并发执行的基本原理和方法。当我们有大量或者耗时的计算操作时,能够合理地使用多线程将大大提高程序的运行效率,同时处理大量数据时也可以有效地减少内存使用。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java多线程并发执行demo代码实例 - Python技术站

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

相关文章

  • Java多线程之ThreadLocal浅析

    Java多线程之ThreadLocal浅析 ThreadLocal 是 Java 中的一个用于多线程编程的类库,它提供了一个线程局部变量,每一个线程都有自己独立的副本,可以对该变量进行读写操作,而且互不影响,解决了多线程环境下共享数据的问题。 使用 ThreadLocal 先看下 ThreadLocal 的使用方式: public class ThreadL…

    多线程 2023年5月17日
    00
  • redis 解决库存并发问题实现数量控制

    请允许我详细讲解一下“redis 解决库存并发问题实现数量控制”的完整攻略。 简介 在电商、餐饮等各个领域,都会遇到商品库存有限的情况,当多个用户同时对同一件商品进行下单或者支付时,就会出现库存并发问题。解决这个问题的方案之一就是使用 Redis,通过 Redis 的原子性的操作来实现库存的控制。 具体步骤 下面是使用 Redis 实现库存控制的具体步骤: …

    多线程 2023年5月16日
    00
  • Spring事务处理Transactional,锁同步和并发线程

    我来为你详细讲解一下“Spring事务处理Transactional,锁同步和并发线程”的完整攻略。 Spring事务处理Transactional Spring的事务管理器提供了一种方便的方式来处理数据库的事务。对于需要保证数据库操作的原子性(ACID)的业务操作,我们常常使用Spring的@Transactional注解。 在一个Spring管理的bea…

    多线程 2023年5月17日
    00
  • Java并发程序刺客之假共享的原理及复现

    Java并发程序刺客之假共享 1. 假共享的概念 假共享(False sharing)是指多个线程访问共享内存中不同的变量,但它们彼此之间共享了同一个缓存行(cache line),这样就会频繁地触发缓存一致性协议,导致性能下降。 缓存一致性协议(Coherence protocol)是指在多个处理器/核心之间共享缓存的时候保持数据一致的一种协议。常见的协议…

    多线程 2023年5月16日
    00
  • 你会用Java代码模拟高并发吗

    如何用Java代码模拟高并发? 模拟高并发是测试系统性能的重要手段,尤其对于需要支持高并发访问的网站或系统,通过模拟高并发场景可以有效地检验系统负载能力的强弱。Java提供了多种方式和工具去模拟高并发场景,常见的有如下三种方式: 使用Java并发编程库的工具类:通过创建线程池,设置线程数及并发请求的方式模拟高并发环境。这种方式代码简单易懂,且适用于大部分场景…

    多线程 2023年5月16日
    00
  • Python多线程编程(二):启动线程的两种方法

    文章标题:Python多线程编程(二):启动线程的两种方法 前言 编写多线程程序可以在某种程度上提高程序的并发性和性能,Python提供了多种方式支持多线程编程。本文将着重讲解启动线程的两种方法:继承threading.Thread类和使用函数式API:threading.Thread。 使用继承方式实现启动线程 创建线程方式中,最常见的方法就是继承Thre…

    多线程 2023年5月17日
    00
  • 总结java多线程之互斥与同步解决方案

    这里是关于“总结java多线程之互斥与同步解决方案”的完整攻略。 一、什么是互斥与同步 多线程编程中,访问共享资源可能会导致数据不安全或者结果不一致的情况,因此需要保证多个线程对共享资源的访问是互斥的,同时又能达到协同工作的目的。在 Java 多线程中,提供了两种机制来实现这个目的:互斥和同步。 互斥:指当多个线程同时访问共享资源时,只允许其中的一个线程在访…

    多线程 2023年5月16日
    00
  • Go语言通过WaitGroup实现控制并发的示例详解

    下面是“Go语言通过WaitGroup实现控制并发的示例详解”的完整攻略。 简介 在并发编程中,我们经常需要协调多个goroutine的执行顺序,有可能需要等待一组goroutine全部执行完成才能进行下一步操作。Go语言提供了sync.WaitGroup来实现这样的控制,并发的方法。 sync.WaitGroup用于等待一组goroutine的执行,我们可…

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