`
尚将军
  • 浏览: 34431 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

使用Java线程并发库实现两个线程交替打印的线程题

 
阅读更多
背景:是这样的今天在地铁上浏览了以下网页,看到网上一朋友问了一个多线程的问题。晚上闲着没事就决定把它实现出来。

题目:

1.开启两个线程,一个线程打印A~Z,两一个线程打印1~52的数据。

2.实现交替打印,输出结果为12A34B...........5152Z.

3.请用多线程方式实现。



这种只有两个线程交替打印数据的题目其实相对还是比较简单的,如果利用传统线程无非就是synchronized(线程互斥)与wait(),notify()的问题。

今天不用传统线程解决这个问题,我们用Java 1.5提供的线程并发库中的类来实现这个功能(实现流程和传统线程一样)



下面是实现代码(我都加了注释,如果还是不同大家可以查看Java 1.5以上的帮助文档)
package cn.yw.thread.practice;

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

/**
 * 多线程练习:
 * 1.开启一个线程打印1~52,开启另一个线程打印A~Z
 * 打印方式:12A34B46C依次打印
 * @author yw-tony
 *
 */
public class PracticeTest {
    
    public static void main(String[] args){
        final DataPrint data = new DataPrint();
        //打印字母的线程(大家也可以把这两个线程抽取出来作为两个单独的类,这里为了实现简单我就直接写在main方法中了)
        new Thread(new Runnable(){
            @Override
            public void run() {
                while(data.letterFlag){
                    data.printLetter();
                }
            }
        }).start();
        
        //打印数字的线程
        new Thread(new Runnable(){
            @Override
            public void run() {
                while(data.numFlag){
                    data.printNun();
                }
            }
        }).start();
        
    }
    /**
     * 打印类
     * @author yw-tony
     *
     */
    static class DataPrint{
        public boolean letterFlag = true;//线程结束标记;
        public boolean numFlag = true;
        //数字的初始值
        int num = 1;
        //字母的初始值
        //这里A~Z的字母对应的阿拉伯数字为65~90,
        int letter = 65;
        //线程等待标记
        boolean flag = true;
        //java线程并发库中的锁相当与(synchronized)
        Lock lock = new ReentrantLock();
        //线程并发库中用于线程之间通讯的类相当于wait(),notify()
        Condition condLetter = lock.newCondition();
        Condition condNum = lock.newCondition();
        /**
         * 打印字字母的方法
         *
         */
        public void printLetter(){
            //如果打印到Z则结束线程并停止
            if(letter >= 90 ){
                letterFlag = false;
                return ;
            } 
            //锁定代码块,锁定时其他线程不能访问其中内容
            lock.lock();
            try{
                if(flag){//如果执行打印数字的线程正在执行,则该线程进入等待状态
                    condLetter.await();
                }
                System.out.println(Thread.currentThread().getName()+":"+(char)letter);
                letter++;
                Thread.sleep(100);
                //打印执行完成,唤醒打印数字的线程
                flag = true;
                condNum.signal();
            }catch(Exception e){
                e.printStackTrace();
            }finally{
                //解锁当前代码快
                lock.unlock();
            }
            
        }
        /**
         * 打印数字的方法
         */
        public void printNun(){
            //如果打印到52则结束线程并停止
            if(num>=52){
                numFlag = false;
                return;
            }
            lock.lock();
            try{
                if(!flag){
                    condNum.await();
                }
                System.out.println(Thread.currentThread().getName()+":"+num);
                num++;
                System.out.println(Thread.currentThread().getName()+":"+num);
                num++;
                Thread.sleep(100);
                flag = false;
                condLetter.signal();//唤醒打印字母的线程
            }catch(Exception e){
                e.printStackTrace();
            }finally{
                lock.unlock();
            }
        }
    }
}
分享到:
评论

相关推荐

    java多线程每个线程挨着打印ABC的4种实现方式

    java多线程每个线程挨着打印ABC的4种实现方式,有4个线程t1、t2、t3、t4,t1打印A后t2打印A再t3打印A再t4打印A,然后从新回到t1打印B再t2打印B...t4打印B... 4个线程轮流打印abc... 一个线程可以理解为一个人,打印...

    JAVA线程高级-线程按序交替执行

    - `Exchanger`则允许两个线程交换数据,每次只有一个线程可以完成交换,从而实现交替执行。 4. **线程间的通信**: - `wait()`, `notify()`, `notifyAll()`是Object类的方法,用于线程间的通信。一个线程调用`...

    C# 多线程互斥 两个线程交替工作

    在C#编程中,多线程是实现并发执行任务的关键技术。当涉及到多个线程同时操作共享资源时,为了确保数据的一致性和完整性,需要采取...合理使用这些机制,能有效地实现两个线程交替工作,从而提高程序的并发处理能力。

    java的thread类重写run方法的双线程从1加到100

    由于线程的并发性,两个线程可能会交错执行,因此输出结果可能会有不同顺序,但最终加法的结果总和应该为5050。 在多线程编程中,需要注意线程安全问题。在这个例子中,因为我们只是简单地打印数值,没有共享变量,...

    iOS-常驻线程之线程循环调用(两个线程循环交替调用)

    本话题主要探讨如何实现两个线程循环交替调用的机制,这通常是为了平衡负载或者实现特定的并发模式。例如,一个线程负责下载数据,另一个线程负责处理数据,两者交替工作,确保系统的高效运行。 首先,我们需要了解...

    java 两个线程相互顺序输出

    标题“java 两个线程相互顺序输出”涉及的问题是如何在多线程环境下控制线程的执行顺序,使得两个线程可以按照特定的顺序交替打印输出。这通常涉及到线程同步和通信的概念。下面将详细解释这些知识点。 1. **线程...

    两个串口多线程通信

    在IT行业中,多线程通信是...总结起来,实现“两个串口多线程通信”需要对操作系统线程机制、串口通信协议和相关API有深入理解。通过合理设计和有效同步,可以构建稳定、高效的串口通信系统,满足各种应用场景的需求。

    实现Runnable接口创建多线程.docx

    在`main()`方法中,我们实例化了一个`Demo`对象`d`,然后使用`Thread`类的构造方法`Thread(Runnable target)`创建了两个线程对象`t1`和`t2`,并将`d`作为参数传入。这样,`t1`和`t2`都将执行`Demo`类中的`run()`方法...

    多线程并发执行任务

    本文将深入探讨多线程并发执行任务的相关知识点,并基于提供的`MyThread.java`文件,来分析和理解如何在Java中实现多线程。 首先,我们需要了解什么是线程。线程是操作系统分配处理器时间的基本单元,一个进程可以...

    java 摇奖程序使用线程实现

    在Java编程语言中,开发一个摇奖程序可以利用线程技术来实现动态、并发的效果,为用户带来更真实的体验。线程使得多个任务能够在同一时间片段内交替执行,模拟出实时交互的感觉。以下是对这个“java摇奖程序”中可能...

    JAVA并发编程艺术pdf版

    - **死锁**:两个或多个线程互相等待对方释放资源,导致无法继续执行。 - **活锁**:线程不断地尝试获取资源,但总是失败,导致无限循环。 7. **线程池**: - **Executor框架**:Java提供的线程池实现,通过...

    Java有两种实现多线程的方式:通过Runnable接口、通过Thread直接实现,请掌握这两种实现方式,并编写示例程序。

    在上述两个示例中,我们通过观察输出结果可以看到,线程的执行并不是按顺序进行的,而是由操作系统的调度策略决定的。这意味着,即使在代码中定义了明确的执行流程,实际运行时,线程可能会被中断和重新调度。 ####...

    两线程交替运行demo

    1. **线程同步**:为了实现线程交替执行,通常需要使用同步机制,比如互斥量(mutex)、条件变量(condition variable)、信号量(semaphore)等。在本例中,可能会使用互斥量来确保只有一个线程在任何时候执行打印...

    使用Java多线程的同步机制编写应用程序.docx

    这个实验不仅加深了我们对并行/并发、同步/异步的理解,还锻炼了我们使用Java多线程解决实际问题的能力。通过这种方式,我们能够确保在多线程环境下,数据的完整性和一致性,这对于构建复杂的分布式系统或高并发应用...

    Java实现多线程轮流打印1-100的数字操作

    对于两个线程交替打印1-100的奇偶数,代码中使用了一个`volatile`关键字修饰的`flag`变量。`volatile`关键字确保了多个线程之间对共享变量的可见性,即一旦一个线程修改了`flag`的值,其他线程可以立即看到这个改变...

    Java多线程实例图形版

    Java提供了多种解决并发问题的工具和机制,如synchronized关键字用于实现线程同步,防止数据不一致;wait()、notify()和notifyAll()方法用于线程间的通信,使得线程可以等待特定条件满足后再继续执行;还有volatile...

    线程实现抽奖游戏 线程 抽奖

    在单核CPU系统中,线程提供了并发执行的机制,使得多个任务可以在一个进程中交替运行,给人一种同时进行的错觉。在Java中,线程可以通过两种方式创建:继承`Thread`类或实现`Runnable`接口。在这个抽奖游戏中,...

    Java并发编程实践.pdf

    其中,数据竞争指的是多个线程同时访问并修改同一变量的情况,而死锁则是指两个或多个线程互相等待对方持有的锁,从而导致无法继续执行的状态。 ##### 2.2 解决方案 为了解决线程安全问题,Java提供了以下几种机制...

    java多线程源码,仅供参考

    在Java中,线程的创建主要有两种方式:一是通过继承`java.lang.Thread`类,二是实现`java.lang.Runnable`接口。继承Thread类的方法简单直接,但限制了类的继承性;而实现Runnable接口则更为灵活,可以避免单继承的...

Global site tag (gtag.js) - Google Analytics