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日

相关文章

  • springboot配置多数据源的一款框架(dynamic-datasource-spring-boot-starter)

    下面我将详细讲解“springboot配置多数据源的一款框架(dynamic-datasource-spring-boot-starter)”的完整攻略。 什么是dynamic-datasource-spring-boot-starter dynamic-datasource-spring-boot-starter(以下简称DDSS)是一款基于Spring …

    Java 2023年5月19日
    00
  • MyBatis-Plus使用ActiveRecord(AR)实现CRUD

    下面是关于“MyBatis-Plus使用ActiveRecord(AR)实现CRUD”的完整攻略: 什么是MyBatis-Plus的ActiveRecord(AR) MyBatis-Plus是一个MyBatis的优秀增强工具,比MyBatis更加强大、方便、强大、灵活,其AR模式是一种ORM思想,使得你可以通过链式调用方法完成CRUD操作,减少了编写重复的S…

    Java 2023年5月26日
    00
  • springmvc参数为对象,数组的操作

    在SpringMVC中,我们可以将请求参数封装为对象或数组,并在Controller中进行操作。本文将详细讲解SpringMVC参数为对象、数组的操作的完整攻略,包括如何定义请求参数对象、如何使用@RequestParam注解获取请求参数、如何使用@ModelAttribute注解绑定请求参数、如何使用@RequestBody注解获取请求体、如何使用@Req…

    Java 2023年5月18日
    00
  • 使用异步controller与jQuery实现卷帘式分页

    下面我来详细讲解如何使用异步controller与jQuery实现卷帘式分页的完整攻略。 什么是卷帘式分页? 卷帘式分页是一种网页分页的效果。就是当我们向下滑动网页的时候,在页面底部会自动加载新的内容,实现不间断的加载效果,类似于卷帘拉开的效果。这种效果可以让用户更加流畅地查看网页内容,提高用户体验。 使用异步controller实现卷帘式分页 异步cont…

    Java 2023年5月19日
    00
  • Spring Security基本配置方法解析

    Spring Security基本配置方法解析 Spring Security是一个强大的安全框架,主要用于保护我们的Web应用程序。在本文中,我们将讨论如何使用Spring Security来保护Web应用程序。 添加Spring Security依赖 Spring Security需要添加以下依赖: <dependency> <grou…

    Java 2023年5月20日
    00
  • Maven项目继承实现过程图解

    下面是关于”Maven项目继承实现过程图解”的完整攻略: 1. 什么是Maven项目继承? Maven项目继承是一种将一个父项目的依赖关系和配置信息传递给子项目的机制。这意味着子项目可以从父项目中继承通用的设置,同时还可以定义自己的独特属性,以适应其特定的需求。 2. Maven项目继承实现过程 Maven项目继承的实现过程主要包括以下几个步骤: 2.1. …

    Java 2023年5月20日
    00
  • 匹配form表单中所有内容的正则表达式

    下面我就来详细讲解匹配form表单中所有内容的正则表达式攻略。 步骤一:理解需求 首先需要理解问题的需求,即需要匹配form表单中所有内容的正则表达式。这里的“所有内容”包括form标签及其所有属性,包括每一个input标签及其属性等等。 步骤二:编写匹配表单标签的正则表达式 首先需要匹配form标签,可以使用以下正则表达式: /<form.*?&gt…

    Java 2023年6月15日
    00
  • 什么是Java缓存技术?

    Java缓存技术是指将计算机处理的结果或持久化数据存储在计算机内存中,以便更快地访问这些数据。Java缓存技术主要用于改善性能,减少应用程序请求数据的间隔时间。在Java中,常用的缓存技术包括内存缓存、文件缓存和Redis缓存等。 内存缓存 内存缓存是一种基于Java集合框架的缓存技术,它将数据存储在应用程序的内存中。内存缓存能够提供快速响应时间,但受到内存…

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