Java 用两个线程交替打印数字和字母

实现Java用两个线程交替打印数字和字母的方法,有很多种。下面给出两种简单明了的方法。

方式一: 使用synchronized关键字

首先,我们定义一个共享的线程类,需要一个计数用的整数类型变量、一个布尔类型的打印数字的标记、线程的名称及一个打印方法。

public class ShareThread {
    private int count = 1;
    private boolean flag = false;
    private String name;

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

    public synchronized void printNum() {
        if (flag) {
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        System.out.println(name + ": " + count);
        count++;
        flag = true;
        notify();
    }

    public synchronized void printChar() {
        if (!flag) {
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        System.out.println(name + ": " + (char) (count + 64));
        count++;
        flag = false;
        notify();
    }
}

在这个类中,我们通过synchronized关键字来保证线程安全,并使用wait()和notify()方法来确保交替打印数字和字母。

接下来,我们定义两个线程,一个线程用来打印数字,另一个用来打印字母,通过实例化ShareThread类来获取线程。

public class PrintDemo {

    public static void main(String[] args) {
        ShareThread shareThread = new ShareThread("Thread-");
        Thread thread1 = new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < 26; i++) {
                    shareThread.printNum();
                }
            }
        });

        Thread thread2 = new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < 26; i++) {
                    shareThread.printChar();
                }
            }
        });

        thread1.start();
        thread2.start();
    }
}

这个程序的输出如下:

Thread-1: 1
Thread-2: A
Thread-1: 2
Thread-2: B
Thread-1: 3
Thread-2: C
Thread-1: 4
Thread-2: D
Thread-1: 5
Thread-2: E
Thread-1: 6
Thread-2: F
Thread-1: 7
Thread-2: G
Thread-1: 8
Thread-2: H
Thread-1: 9
Thread-2: I
Thread-1: 10
Thread-2: J
Thread-1: 11
Thread-2: K
Thread-1: 12
Thread-2: L
Thread-1: 13
Thread-2: M
Thread-1: 14
Thread-2: N
Thread-1: 15
Thread-2: O
Thread-1: 16
Thread-2: P
Thread-1: 17
Thread-2: Q
Thread-1: 18
Thread-2: R
Thread-1: 19
Thread-2: S
Thread-1: 20
Thread-2: T
Thread-1: 21
Thread-2: U
Thread-1: 22
Thread-2: V
Thread-1: 23
Thread-2: W
Thread-1: 24
Thread-2: X
Thread-1: 25
Thread-2: Y
Thread-1: 26

方式二: 使用 Lock 和 Condition 接口

这种方式和上面的方式类似,只不过使用了 Lock 和 Condition 接口。

首先,我们定义一个共享的线程类,需要一个计数用的整数类型变量、一个布尔类型的打印数字的标记、线程的名称及一个打印方法。

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class ShareThread {
    private int count = 1;
    private boolean flag = false;
    private String name;

    private Lock lock = new ReentrantLock();
    private Condition condition = lock.newCondition();

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

    public void printNum() {
        lock.lock();
        try {
            if (flag) {
                try {
                    condition.await();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            System.out.println(name + ": " + count);
            count++;
            flag = true;
            condition.signalAll();
        } finally {
            lock.unlock();
        }
    }

    public void printChar() {
        lock.lock();
        try {
            if (!flag) {
                try {
                    condition.await();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            System.out.println(name + ": " + (char) (count + 64));
            count++;
            flag = false;
            condition.signalAll();
        } finally {
            lock.unlock();
        }
    }
}

这个类的实现基本和上面的方式相似,只不过使用了Lock和Condition接口来实现线程的同步。

接下来,我们定义两个线程,一个线程用来打印数字,另一个用来打印字母,通过实例化ShareThread类来获取线程。

public class PrintDemo2 {
    public static void main(String[] args) {
        ShareThread shareThread = new ShareThread("Thread-");
        Thread thread1 = new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < 26; i++) {
                    shareThread.printNum();
                }
            }
        });

        Thread thread2 = new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < 26; i++) {
                    shareThread.printChar();
                }
            }
        });

        thread1.start();
        thread2.start();
    }
}

这个程序的输出和上面的程序相同,输出如下:

Thread-1: 1
Thread-2: A
Thread-1: 2
Thread-2: B
Thread-1: 3
Thread-2: C
Thread-1: 4
Thread-2: D
Thread-1: 5
Thread-2: E
Thread-1: 6
Thread-2: F
Thread-1: 7
Thread-2: G
Thread-1: 8
Thread-2: H
Thread-1: 9
Thread-2: I
Thread-1: 10
Thread-2: J
Thread-1: 11
Thread-2: K
Thread-1: 12
Thread-2: L
Thread-1: 13
Thread-2: M
Thread-1: 14
Thread-2: N
Thread-1: 15
Thread-2: O
Thread-1: 16
Thread-2: P
Thread-1: 17
Thread-2: Q
Thread-1: 18
Thread-2: R
Thread-1: 19
Thread-2: S
Thread-1: 20
Thread-2: T
Thread-1: 21
Thread-2: U
Thread-1: 22
Thread-2: V
Thread-1: 23
Thread-2: W
Thread-1: 24
Thread-2: X
Thread-1: 25
Thread-2: Y
Thread-1: 26

综上所述,以上是Java用两个线程交替打印数字和字母的两种实现方式及代码示例。两种方法都有自己的优劣,在实际应用中需要考虑到程序的性能和复杂度等方面来选择合适的实现方式。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java 用两个线程交替打印数字和字母 - Python技术站

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

相关文章

  • 详解Java实现拓扑排序算法

    详解Java实现拓扑排序算法 什么是拓扑排序算法 拓扑排序算法是一种用来解决有向图中节点之间依赖关系问题的算法,它可以将有向无环图(DAG)中的所有节点按照一定的规则排序,可以用来确定一组任务的执行顺序,比如编译器可以用拓扑排序来确定源代码的编译顺序。 拓扑排序算法原理 拓扑排序算法基于DAG图,DAG图中每个节点表示一个任务,有向边表示任务之间的依赖关系,…

    Java 2023年5月19日
    00
  • 面试官问如何启动Java 线程

    启动Java线程有两种方式:继承Thread类和实现Runnable接口。下面分别讲解这两种方式的启动步骤。 继承Thread类启动线程 步骤 继承Thread类并重写其run()方法 创建Thread类的实例对象 调用start()方法启动线程 示例 下面是一个继承Thread类的简单示例: public class MyThread extends Th…

    Java 2023年5月27日
    00
  • SpringBoot浅析安全管理之Shiro框架

    SpringBoot浅析安全管理之Shiro框架指南 简介 Shiro 是一个强大且易用的 Java 安全框架,提供身份验证、授权、加密和会话管理等功能,可以相对简单地集成到你的应用中,并提供了灵活的配置选项。在 Spring Boot 应用中使用 Shiro,可以提供全面的安全保护,并为开发人员提供便利的开发体验。 Shiro 核心概念 Shiro 包含以…

    Java 2023年5月20日
    00
  • Java算法练习题,每天进步一点点(1)

    首先,对于这篇题解的标题,可以使用一二级标题展示: Java算法练习题,每天进步一点点(1) 题意说明 本练习题题目数量较多,可根据自己的情况自行选择练习。本文以题目1为例: 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。 示例1: 输入: “abcabcbb”输出: 3解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。 示…

    Java 2023年5月19日
    00
  • SpringBoot路径映射实现过程图解

    下面是关于“SpringBoot路径映射实现过程图解”的完整攻略,包含两个示例说明。 SpringBoot路径映射实现过程图解 在SpringBoot中,我们可以使用注解来实现路径映射。路径映射是指将HTTP请求映射到相应的处理方法上。本文将介绍SpringBoot中路径映射的实现过程,并提供两个示例说明。 实现过程 在SpringBoot中,我们可以使用@…

    Java 2023年5月17日
    00
  • java对XML文件的解析、节点的增加、删除操作总结

    Java对XML文件的解析、节点的增加、删除操作总结 在Java中,我们常常需要对XML文件进行解析、节点的增加或删除操作。下面将从以下两个方面对这一问题进行分析。 1. XML文件的解析 1.1 使用JDOM进行XML文件解析 JDOM是一款功能强大的Java XML解析库,它可以对XML文档进行解析,并操作XML文档中的元素和属性。其解析XML文档的核心…

    Java 2023年6月15日
    00
  • java中的反射应用实现

    Java中的反射机制提供了一种在运行时检查和修改类、接口、方法和变量等的工具,可以帮助程序员实现更加灵活和动态的编程。 反射基础 在Java中,每个class都有一个Class对象,反射机制就是通过这个对象来获取和操作类的信息。可以使用以下方法来获得一个类的Class对象: Class clazz = Person.class; //第一种方式 Class …

    Java 2023年5月19日
    00
  • 基于java实现停车场管理系统

    以下是详细讲解“基于Java实现停车场管理系统”的完整攻略: 一、需求分析 在实现停车场管理系统之前,我们需要首先进行需求分析,明确系统的功能需求、用户需求、业务流程等,为后续的开发工作做好准备。具体来说,需求分析需要包括如下步骤:1. 系统功能需求分析2. 用户需求分析3. 业务流程分析4. 功能模块的划分和设计 二、技术选型 在确定系统的功能需求和设计后…

    Java 2023年5月24日
    00
合作推广
合作推广
分享本页
返回顶部