用两个线程,一个输出字母,一个输出数字,交替输出 1A2B3C4D...26Z

Posted zhoudelun

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用两个线程,一个输出字母,一个输出数字,交替输出 1A2B3C4D...26Z相关的知识,希望对你有一定的参考价值。

using System;
using System.Threading;

class PrintThread

    private string name;
    private AutoResetEvent waitEvent;
    private AutoResetEvent nextEvent;
    private int start;
    private int end;

    public PrintThread(string name, AutoResetEvent waitEvent, AutoResetEvent nextEvent, int start, int end)
    
        this.name = name;
        this.waitEvent = waitEvent;
        this.nextEvent = nextEvent;
        this.start = start;
        this.end = end;
    

    public void Run()
    
        for (int i = start; i <= end; i += 2)
        
            waitEvent.WaitOne();  // 等待前一个线程的信号

            if (name == "NumberThread")
            
                Console.Write("0", i);
            
            else if (name == "LetterThread")
            
                Console.Write("0", (char)(i + 64));
            

            nextEvent.Set();  // 通知下一个线程继续执行
        
    


class Program

    static void Main(string[] args)
    
        AutoResetEvent eventNumber = new AutoResetEvent(false);
        AutoResetEvent eventLetter = new AutoResetEvent(false);

        PrintThread threadNumber = new PrintThread("NumberThread", eventLetter, eventNumber, 1, 26);
        PrintThread threadLetter = new PrintThread("LetterThread", eventNumber, eventLetter, 2, 27);

        Thread tNumber = new Thread(threadNumber.Run);
        Thread tLetter = new Thread(threadLetter.Run);

        tNumber.Start();
        tLetter.Start();

        // 启动第一个线程
        eventLetter.Set();

        // 等待所有线程完成打印任务
        tNumber.Join();
        tLetter.Join();

        Console.WriteLine("\\nAll threads have finished printing.");
    

在这段代码中,我们创建了两个PrintThread对象,分别表示数字线程和字母线程。每个线程负责输出一定范围内的数字或字母,并在输出完成之后等待另一个线程的信号。我们使用AutoResetEvent来实现线程之间的信号传递。

在主程序中,我们创建了两个AutoResetEvent对象,并将它们分别传递给数字线程和字母线程。然后,我们启动这两个线程,并使用第一个AutoResetEvent对象启动第一轮打印任务。在每轮打印任务结束之后,我们使用另一个AutoResetEvent对象通知另一个线程继续执行。最终,我们等待所有线程完成打印任务,并输出一条完成消息。

import java.util.concurrent.Semaphore;

public class PrintThread implements Runnable 
    private String name;
    private Semaphore current;
    private Semaphore next;
    private int start;
    private int end;

    public PrintThread(String name, Semaphore current, Semaphore next, int start, int end) 
        this.name = name;
        this.current = current;
        this.next = next;
        this.start = start;
        this.end = end;
    

    public void run() 
        for (int i = start; i <= end; i += 2) 
            try 
                current.acquire(); // 等待前一个线程的信号
             catch (InterruptedException e) 
                e.printStackTrace();
            

            if (name.equals("NumberThread")) 
                System.out.print(i);
             else if (name.equals("LetterThread")) 
                System.out.print((char) (i + 64));
            

            next.release(); // 通知下一个线程继续执行
        
    


public class Main 
    public static void main(String[] args) 
        Semaphore semaphoreNumber = new Semaphore(0);
        Semaphore semaphoreLetter = new Semaphore(1);

        PrintThread threadNumber = new PrintThread("NumberThread", semaphoreLetter, semaphoreNumber, 1, 26);
        PrintThread threadLetter = new PrintThread("LetterThread", semaphoreNumber, semaphoreLetter, 2, 27);

        Thread tNumber = new Thread(threadNumber);
        Thread tLetter = new Thread(threadLetter);

        tNumber.start();
        tLetter.start();

        // 启动第一个线程
        semaphoreLetter.release();

        // 等待所有线程完成打印任务
        try 
            tNumber.join();
            tLetter.join();
         catch (InterruptedException e) 
            e.printStackTrace();
        

        System.out.println("\\nAll threads have finished printing.");
    

在这段代码中,我们创建了两个PrintThread对象,分别表示数字线程和字母线程。每个线程负责输出一定范围内的数字或字母,并在输出完成之后等待另一个线程的信号。我们使用Semaphore来实现线程之间的信号传递。

在主程序中,我们创建了两个Semaphore对象,并将它们分别传递给数字线程和字母线程。然后,我们启动这两个线程,并使用第一个Semaphore对象启动第一轮打印任务。在每轮打印任务结束之后,我们使用另一个Semaphore对象通知另一个线程继续执行。最终,我们等待所有线程完成打印任务,并输出一条完成消息。

以上是关于用两个线程,一个输出字母,一个输出数字,交替输出 1A2B3C4D...26Z的主要内容,如果未能解决你的问题,请参考以下文章

两个线程一个输出字母,一个输出数字,交替输出A1B2C3D4E5F6G7。

go练习:交叉输出数字和字母

synchronized如何实现两个线程交替运行?看完你就懂了,列害dei

面试题:用程序实现两个线程交替打印 0~100 的奇偶数

Java 测试:创建两个线程,模拟对话,交替输出

使用ReentrantLock的newCondition交替输出数组