用java写一段程序,实现两个线程循环打印

时间: 2023-09-05 16:04:15 浏览: 89
### 回答1: ``` class PrinterThread extends Thread { private String name; public PrinterThread(String name) { this.name = name; } public void run() { for (int i = 0; i < 10; i++) { System.out.println(name + ": " + i); try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } } } } public class Main { public static void main(String[] args) { PrinterThread t1 = new PrinterThread("Thread 1"); PrinterThread t2 = new PrinterThread("Thread 2"); t1.start(); t2.start(); } } ``` 该代码创建了两个线程`PrinterThread t1`和`PrinterThread t2`,并在`run`方法中实现了循环打印。每个线程在每次循环打印后休眠100毫秒,以让另一个线程有机会执行。 ### 回答2: 可以使用Java的多线程机制来实现两个线程循环打印的功能。以下是示例代码: ```java public class LoopPrinting { private static final Object lock = new Object(); private static int num = 1; private static int count = 1; public static void main(String[] args) { Thread threadA = new Thread(new PrintThread("A", 1)); Thread threadB = new Thread(new PrintThread("B", 2)); threadA.start(); threadB.start(); } static class PrintThread implements Runnable { private String threadName; private int threadNumber; public PrintThread(String threadName, int threadNumber) { this.threadName = threadName; this.threadNumber = threadNumber; } @Override public void run() { while (num <= 100) { synchronized (lock) { if (count % 3 == threadNumber - 1) { System.out.println(threadName + ":" + num); num++; count++; lock.notifyAll(); } else { try { lock.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } } } } } } ``` 在上述代码中,定义了一个共享的锁对象`lock`,一个共享的计数变量`num`和一个判断打印顺序的变量`count`。两个线程`ThreadA`和`ThreadB`通过`PrintThread`类实例化,并传入不同的线程名和线程编号。 在`PrintThread`的`run`方法中,使用`synchronized`关键字锁定`lock`对象,保证在每个线程执行时只有一个线程能够访问共享资源。通过判断`count`变量的值,实现两个线程循环打印。其中`count % 3`的结果等于`threadNumber`减一,表示该线程可以进行打印操作。 当线程打印完一个数字后,更新`num`和`count`的值,并使用`lock.notifyAll()`唤醒其他正在等待的线程。然后当前线程释放锁并进入等待状态,直到其他线程唤醒它。 ### 回答3: 可以使用Java中的多线程编程来实现两个线程的循环打印。以下是一个简单的示例代码: ```java public class TwoThreadPrinting { private static final Object lock = new Object(); private static volatile boolean isThread1Turn = true; // 标识线程1是否应该打印 public static void main(String[] args) { Thread thread1 = new Thread(new PrintThread(1)); Thread thread2 = new Thread(new PrintThread(2)); thread1.start(); thread2.start(); } private static class PrintThread implements Runnable { private final int threadNumber; public PrintThread(int threadNumber) { this.threadNumber = threadNumber; } @Override public void run() { try { for (int i = 1; i <= 10; i++) { synchronized (lock) { // 如果当前线程不是轮到自己打印,则当前线程等待 while ((threadNumber == 1 && !isThread1Turn) || (threadNumber == 2 && isThread1Turn)) { lock.wait(); } System.out.println("Thread " + threadNumber + ": " + i); isThread1Turn = !isThread1Turn; // 切换下一个线程的打印权限 lock.notifyAll(); // 唤醒所有等待的线程 } } } catch (InterruptedException e) { e.printStackTrace(); } } } } ``` 在上述代码中,我们定义了一个`TwoThreadPrinting`类,并在该类中创建了两个线程对象`thread1`和`thread2`。每个线程都被分配了一个`PrintThread`实例,其中`PrintThread`实现了`Runnable`接口,并且重写了`run`方法。在`run`方法中,通过`synchronized`关键字和`wait`、`notifyAll`方法来实现线程的同步与等待。 在程序运行过程中,每个线程都会进行循环打印10次,打印的内容格式为`Thread x: y`,其中`x`表示线程编号,`y`表示打印的数字。线程1在打印完当前数字后,会将`isThread1Turn`设置为`false`,然后唤醒线程2;而线程2在打印完当前数字后,会将`isThread1Turn`设置为`true`,然后唤醒线程1。这样两个线程就能够循环打印了。

相关推荐

最新推荐

recommend-type

java多线程编程之从线程返回数据的两种方法

1. **使用 `sleep()` 延迟**:通过让主线程休眠一段时间等待子线程完成,但这种方法不准确,因为休眠时间难以预估。 2. **循环检查成员变量**:使用 `while` 循环检查成员变量是否已赋值,如果未赋值则休眠一定时间...
recommend-type

多线程设计一个火车售票模拟程序

每个线程都可以独立地执行一段代码,这使得我们可以同时执行多个任务。在本实验中,我们将创建5个线程,每个线程都对应一个售票点。 线程同步 在多线程环境中,线程之间的通信和同步非常重要。在本实验中,我们...
recommend-type

Java线程监听,意外退出线程后自动重启的实现方法

在Java中,我们可以使用java.util.Observable和java.util.Observer两个接口来实现观察者模式。Observable接口用于定义被观察的对象,而Observer接口用于定义观察者对象。 三、实现代码 下面是一个使用观察者模式来...
recommend-type

如何通过jstack命令dump线程信息

在示例代码中,`DeadLockDemo`类的`deadLock()`方法创建了两个线程`t1`和`t2`。线程`t1`先获取锁A,然后尝试获取锁B,而`t2`则相反,先获取锁B再试图获取锁A。由于这两个线程都在等待对方释放锁,所以形成了死锁。`...
recommend-type

Java 多线程与并发编程总结.doc

在并发编程中,还需要关注线程安全问题,例如死锁(两个或更多线程互相等待对方释放资源)、活锁(线程因不断尝试获取资源但无法成功而造成无尽循环)、饥饿(某些线程因资源分配不公而无法执行)等。为了解决这些...
recommend-type

基于嵌入式ARMLinux的播放器的设计与实现 word格式.doc

本文主要探讨了基于嵌入式ARM-Linux的播放器的设计与实现。在当前PC时代,随着嵌入式技术的快速发展,对高效、便携的多媒体设备的需求日益增长。作者首先深入剖析了ARM体系结构,特别是针对ARM9微处理器的特性,探讨了如何构建适用于嵌入式系统的嵌入式Linux操作系统。这个过程包括设置交叉编译环境,优化引导装载程序,成功移植了嵌入式Linux内核,并创建了适合S3C2410开发板的根文件系统。 在考虑到嵌入式系统硬件资源有限的特点,通常的PC机图形用户界面(GUI)无法直接应用。因此,作者选择了轻量级的Minigui作为研究对象,对其实体架构进行了研究,并将其移植到S3C2410开发板上,实现了嵌入式图形用户界面,使得系统具有简洁而易用的操作界面,提升了用户体验。 文章的核心部分是将通用媒体播放器Mplayer移植到S3C2410开发板上。针对嵌入式环境中的音频输出问题,作者针对性地解决了Mplayer播放音频时可能出现的不稳定性,实现了音乐和视频的无缝播放,打造了一个完整的嵌入式多媒体播放解决方案。 论文最后部分对整个项目进行了总结,强调了在嵌入式ARM-Linux平台上设计播放器所取得的成果,同时也指出了一些待改进和完善的方面,如系统性能优化、兼容性提升以及可能的扩展功能等。关键词包括嵌入式ARM-Linux、S3C2410芯片、Mplayer多媒体播放器、图形用户界面(GUI)以及Minigui等,这些都反映出本文研究的重点和领域。 通过这篇论文,读者不仅能了解到嵌入式系统与Linux平台结合的具体实践,还能学到如何在资源受限的环境中设计和优化多媒体播放器,为嵌入式技术在多媒体应用领域的进一步发展提供了有价值的经验和参考。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

Python字符串为空判断的动手实践:通过示例掌握技巧

![Python字符串为空判断的动手实践:通过示例掌握技巧](https://img-blog.csdnimg.cn/72f88d4fc1164d6c8b9c29d8ab5ed75c.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBASGFyYm9yIExhdQ==,size_20,color_FFFFFF,t_70,g_se,x_16) # 1. Python字符串为空判断的基础理论 字符串为空判断是Python编程中一项基本且重要的任务。它涉及检查字符串是否为空(不包含任何字符),这在
recommend-type

box-sizing: border-box;作用是?

`box-sizing: border-box;` 是 CSS 中的一个样式属性,它改变了元素的盒模型行为。默认情况下,浏览器会计算元素内容区域(content)、内边距(padding)和边框(border)的总尺寸,也就是所谓的"标准盒模型"。而当设置为 `box-sizing: border-box;` 后,元素的总宽度和高度会包括内容、内边距和边框的总空间,这样就使得开发者更容易控制元素的实际布局大小。 具体来说,这意味着: 1. 内容区域的宽度和高度不会因为添加内边距或边框而自动扩展。 2. 边框和内边距会从元素的总尺寸中减去,而不是从内容区域开始计算。
recommend-type

经典:大学答辩通过_基于ARM微处理器的嵌入式指纹识别系统设计.pdf

本文主要探讨的是"经典:大学答辩通过_基于ARM微处理器的嵌入式指纹识别系统设计.pdf",该研究专注于嵌入式指纹识别技术在实际应用中的设计和实现。嵌入式指纹识别系统因其独特的优势——无需外部设备支持,便能独立完成指纹识别任务,正逐渐成为现代安全领域的重要组成部分。 在技术背景部分,文章指出指纹的独特性(图案、断点和交叉点的独一无二性)使其在生物特征认证中具有很高的可靠性。指纹识别技术发展迅速,不仅应用于小型设备如手机或门禁系统,也扩展到大型数据库系统,如连接个人电脑的桌面应用。然而,桌面应用受限于必须连接到计算机的条件,嵌入式系统的出现则提供了更为灵活和便捷的解决方案。 为了实现嵌入式指纹识别,研究者首先构建了一个专门的开发平台。硬件方面,详细讨论了电源电路、复位电路以及JTAG调试接口电路的设计和实现,这些都是确保系统稳定运行的基础。在软件层面,重点研究了如何在ARM芯片上移植嵌入式操作系统uC/OS-II,这是一种实时操作系统,能够有效地处理指纹识别系统的实时任务。此外,还涉及到了嵌入式TCP/IP协议栈的开发,这是实现系统间通信的关键,使得系统能够将采集的指纹数据传输到远程服务器进行比对。 关键词包括:指纹识别、嵌入式系统、实时操作系统uC/OS-II、TCP/IP协议栈。这些关键词表明了论文的核心内容和研究焦点,即围绕着如何在嵌入式环境中高效、准确地实现指纹识别功能,以及与外部网络的无缝连接。 这篇论文不仅深入解析了嵌入式指纹识别系统的硬件架构和软件策略,而且还展示了如何通过结合嵌入式技术和先进操作系统来提升系统的性能和安全性,为未来嵌入式指纹识别技术的实际应用提供了有价值的研究成果。