用两个线程,一个输出字母,一个输出数字,交替输出 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
对象通知另一个线程继续执行。最终,我们等待所有线程完成打印任务,并输出一条完成消息。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)