Java五种方式实现多线程循环打印问题

想要实现多线程循环打印问题,可以使用Java中的五种方式,包括继承Thread类、实现Runnable接口、实现Callable接口、使用线程池和使用定时器Timer。

继承Thread类

继承Thread类是实现多线程的一种方式,需要重写Thread类的run()方法来创建线程。代码示例如下:

public class ThreadDemo extends Thread {
    private String name;
    public ThreadDemo(String name) {
        this.name = name;
    }
    @Override
    public void run() {
        for(int i = 0; i < 3; i++) {
            System.out.println(name + ":" + i);
        }
    }

    public static void main(String[] args) {
        ThreadDemo t1 = new ThreadDemo("线程1");
        ThreadDemo t2 = new ThreadDemo("线程2");
        t1.start();
        t2.start();
    }
}

实现Runnable接口

另一种方式是实现Runnable接口来创建线程,也需要重写run()方法。相比继承Thread类,实现Runnable接口更为灵活,也更容易实现代码的复用。代码示例如下:

public class RunnableDemo implements Runnable {
    private String name;

    public RunnableDemo(String name) {
        this.name = name;
    }

    @Override
    public void run() {
        for(int i = 0; i < 3; i++) {
            System.out.println(name + ":" + i);
        }
    }

    public static void main(String[] args) {
        RunnableDemo rd1 = new RunnableDemo("线程1");
        RunnableDemo rd2 = new RunnableDemo("线程2");
        Thread t1 = new Thread(rd1);
        Thread t2 = new Thread(rd2);
        t1.start();
        t2.start();
    }
}

实现Callable接口

实现Callable接口的方式和实现Runnable接口的方式类似,也需要重写call()方法。不同的是,实现Runnable接口的run()方法不会返回值,而实现Callable接口的call()方法会返回一个值,可以使用FutureTask来获取返回值。代码示例如下:

public class CallableDemo implements Callable<String> {
    private String name;

    public CallableDemo(String name) {
        this.name = name;
    }

    @Override
    public String call() throws Exception {
        String result = "";
        for(int i = 0; i < 3; i++) {
            result += name + ":" + i + "\n";
        }
        return result;
    }

    public static void main(String[] args) {
        CallableDemo cd1 = new CallableDemo("线程1");
        CallableDemo cd2 = new CallableDemo("线程2");
        FutureTask<String> task1 = new FutureTask<>(cd1);
        FutureTask<String> task2 = new FutureTask<>(cd2);
        new Thread(task1).start();
        new Thread(task2).start();
        try {
            System.out.println(task1.get());
            System.out.println(task2.get());
        } catch (InterruptedException | ExecutionException e) {
            e.printStackTrace();
        }
    }
}

使用线程池

使用线程池可以更好地管理线程,避免线程数量过多导致系统资源的浪费。Java中提供了ThreadPoolExecutor类来实现线程池的创建,利用execute()方法将Runnable或Callable对象提交给线程池进行执行。代码示例如下:

public class ThreadPoolDemo {
    public static void main(String[] args) {
        ExecutorService executor = Executors.newCachedThreadPool();
        for(int i = 0; i < 3; i++) {
            executor.execute(new Runnable() {
                @Override
                public void run() {
                    System.out.println(Thread.currentThread().getName() + " run.");
                }
            });
        }
        executor.shutdown();
    }
}

使用定时器Timer

使用定时器Timer也可以实现多线程的循环打印问题。使用Timer可以让任务在一定时间后执行,同时可以设置循环次数和延迟时间。代码示例如下:

public class TimerDemo {
    public static void main(String[] args) {
        TimerTask task = new TimerTask() {
            int count = 0;
            @Override
            public void run() {
                System.out.println(Thread.currentThread().getName() + " run.");
                count++;
                if(count >= 3) {
                    cancel();
                }
            }
        };
        Timer timer = new Timer();
        timer.scheduleAtFixedRate(task,0, 2000);
    }
}

以上五种方式均可以实现多线程的循环打印问题,具体选择哪种方式要根据具体的情况进行判断。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java五种方式实现多线程循环打印问题 - Python技术站

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

相关文章

  • C#多线程系列之线程完成数

    C#多线程系列之线程完成数 简介 本文将介绍如何使用C#来获取多线程环境下的线程完成数,以方便监控和调试多线程应用程序,降低程序的复杂度,并提高程序的性能。 获取线程完成数的方法 在C#中,可以使用ManualResetEvent类来实现线程完成数的获取。该类提供的Reset()、WaitOne()、Set()方法可以方便地实现线程的启动、阻塞和唤醒。 具体…

    多线程 2023年5月17日
    00
  • C语言线程对象和线程存储的实现

    C语言线程对象和线程存储的实现涉及到操作系统底层的多线程机制,一般情况下需要用到系统提供的线程库来实现。下面将从以下三个方面介绍C语言线程对象和线程存储的实现。 线程对象的实现 线程对象是描述线程的实体,跟进程一样,线程对象通常包含线程ID、状态、执行栈等信息。在Unix/Linux系统中,线程对象可以用pthread_t结构体来表示,Windows系统中,…

    多线程 2023年5月16日
    00
  • 一文读懂吞吐量(TPS)、QPS、并发数、响应时间(RT)概念

    一文读懂吞吐量(TPS)、QPS、并发数、响应时间(RT) 什么是吞吐量(TPS)? 吞吐量(TPS),是指在单位时间内系统处理的事务数。其中的“事务”可以是任何系统操作,如HTTP请求、数据库查询等等。吞吐量是评价系统性能的一个重要指标,通常用来衡量同时处理多少用户请求的能力。 举例说明,如果在1秒钟内系统处理了100个事务,则吞吐量为100 TPS。 什…

    多线程 2023年5月16日
    00
  • PHP使用CURL_MULTI实现多线程采集的例子

    下面就详细讲解一下 “PHP使用CURL_MULTI实现多线程采集的例子”: 介绍 CURL是一个网络请求库,它可以以各种协议发送请求并获取响应。PHP内置了CURL扩展,使用它可以轻松地实现网络请求。CURL_MULTI是CURL的多线程版本,可以并发处理多个CURL请求。 在本篇文章中,我们将介绍如何利用PHP中的CURL_MULTI实现多线程采集。 步…

    多线程 2023年5月16日
    00
  • Spring boot使用多线程过程步骤解析

    Spring Boot使用多线程过程步骤解析 在Web应用程序中,通常需要进行一些异步处理操作,例如将数据处理后保存至数据库;向其他系统发送请求并等待其响应等操作。使用多线程技术能够更好地满足这些需求。在Spring Boot中,使用多线程需要遵循以下步骤: 步骤1:创建一个线程池 Spring Boot中使用ThreadPoolTaskExecutor类来…

    多线程 2023年5月17日
    00
  • 详解java中的互斥锁信号量和多线程等待机制

    详解Java中的互斥锁、信号量和多线程等待机制 互斥锁 介绍 互斥锁(Mutual Exclusion Lock),简称 Mutex,是用于保护共享资源的一种机制。当多个线程同时访问共享资源时,互斥锁可以确保同一时刻只有一个线程可以访问该资源。在 Java 中,互斥锁可以通过 synchronized 关键字来实现。 示例 下面是一个使用互斥锁的示例,其中 …

    多线程 2023年5月16日
    00
  • Windows下使用Dev-C++开发基于pthread.h的多线程程序实例

    接下来我为你详细讲解如何在Windows下使用Dev-C++开发基于pthread.h的多线程程序实例。 准备工作 安装Dev-C++ 在开始之前,我们首先需要安装Dev-C++,可以从官网 https://sourceforge.net/projects/orwelldevcpp/ 下载最新的Dev-C++安装包。 安装pthread库 接下来我们需要安装…

    多线程 2023年5月17日
    00
  • Java 并发编程ArrayBlockingQueue的实现

    Java 并发编程 ArrayBlockingQueue 的实现 ArrayBlockingQueue 简介 java.util.concurrent.ArrayBlockingQueue<E> 是 Java 并发编程中的一个阻塞队列,它实现了 BlockingQueue<E> 接口,具有线程安全、高性能、阻塞等特点,由数组实现。 下…

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