三线程连续打印ABC

 1 package test5;
 2
 3 import java.util.concurrent.locks.Condition;
 4 import java.util.concurrent.locks.ReentrantLock;
 5
 6 class PrintThread implements Runnable{
 7
 8     private ReentrantLock lock=new ReentrantLock();
 9     Condition condition = lock.newCondition();
10     private int state=0;
11
12     @Override
13     public void run() {
14         String threadName=Thread.currentThread().getName();
15         lock.lock();
16         try {
17             for(int i=0;i<9;i++){
18                 if(threadName.equals("A")){
19                     while(state%3!=0){
20                         condition.await();
21                     }
22                 }else if(threadName.equals("B")){
23                     while(state%3!=1){
24                         condition.await();
25                     }
26                 }else if(threadName.equals("C")){
27                     while(state%3!=2){
28                         condition.await();
29                     }
30                 }
31                 state++;
32                 System.out.println(threadName);
33                 condition.signalAll();
34             }
35         } catch (Exception e) {
36             // TODO: handle exception
37         }finally{
38             lock.unlock();
39         }
40
41
42     }
43
44 }
45
46 public class PrintABC{
47     public static void main(String[] args) {
48         PrintThread pt=new PrintThread();
49         Thread t1=new Thread(pt,"A");
50         Thread t2=new Thread(pt,"B");
51         Thread t3=new Thread(pt,"C");
52         t1.start();
53         t2.start();
54         t3.start();
55     }
56 }
时间: 2024-10-13 08:14:50

三线程连续打印ABC的相关文章

线程三线程安全

线程三线程安全对于多线程的系统来说,如果不加以限制的话,会造成数据安全等问题,对于数据安全问题会有如下问题:1.读取脏数据 在读取数据的时候,数据被修改了,而程序读取的是修改过的或者没有修改过的,反正不是自己期望读取的数据的值.2.数据不一致 在使用多线程进行数据处理的时候,最终得出来的数据每一次执行都不一样.3.数据错乱 在数据的打印或者数组中,会造成数据的顺序错乱,对于关系可能会错乱.--对于数据的安全性,java提供了一些解决的方法:1.使用synchronized同步关键字2.使用vol

三线程加速无损视频解码

无损解码速度快,需要56ms(基于YUV和DCT的需要1.6s),经过优化,比如将for循环改为C语言自带的memcpy替换,提升到50ms,还不足于正常播放,因为1000ms/50ms=20帧峰值.为此需要提速,如果正常播放25帧视频,则需要可播放30帧的能力. 1. 对于图像提速可采用以下方法: 1.1 汇编方法:汇编可起到事半功倍的作用,但对于复杂的程序比如视频编码,转换很困难,需要时间和“汇编功力”. 1.2 图像分割方法:将图像“分割”为n等分区域,分别用线程同时运行,起到并行加速作用

java三线程循环有序打印ABC

迅雷笔试题: 编写一个程序,开启3个线程,这3个线程的ID分别为A.B.C,每个线程将自己的ID在屏幕上打印10遍,要求输出结果必须按ABC的顺序显示:如:ABCABC….依次递推. 解决思路:每个线程运行时先检查他依赖的线程是否已完成工作,线程B依赖线程A的完成,线程C依赖线程B和线程A的完成,线程A依赖线程C的完成.如果当前线程依赖的线程没有执行完,则阻塞当前线程直到条件满足再执行. Condition.await()会使当前线程暂时阻塞,并释放ReentrantLock锁. Conditi

多线程面试题之【三线程按顺序交替打印ABC的方法】

建立三个线程,线程名字分别为:A.B.C,要求三个线程分别打印自己的线程名字,但是要求三个线程同时运行,并且实现交替打印,即按照ABCABCABC的顺序打印.打印10轮,打印完毕控制台输出字符串:"打印完毕" 方法之一:使用Condition等待唤醒机制,代码如下: import java.util.concurrent.CountDownLatch; import java.util.concurrent.locks.Condition; import java.util.concu

[******] java多线程连续打印abc

题目描述 建立三个线程A.B.C,A线程打印10次字母A,B线程打印10次字母B,C线程打印10次字母C,但是要求三个线程同时运行,并且实现交替打印,即按照ABCABCABC的顺序打印. 5种方法 使用synchronized, wait和notifyAll 使用Lock->ReentrantLock 和 state标志 使用Lock->ReentrantLock 和Condition(await .signal.signalAll) 使用Semaphore 使用AtomicInteger 扩

第三次作业(ABC类代码优化及感悟)

代码优化1:将A类体现出了封装性(BC类同理). 1 package aaa; 2 import java.util.Scanner; 3 //工具类 4 public class Text1 { 5 static int sum; 6 public int count(int start,int end){ 7 int []arr1={-2574,-4010,8243,771,2447,-5197,2556,8044,3314,3617,6065,-2817,3131,6318,2186,-1

多线程编程学习三(线程间通信)

一.概要 线程是操作系统中独立的个体,但这些个体如果不经过特殊的处理就不能成为一个整体,线程间的通信就是成为整体的必用方案之一.可以说,使线程进行通信后,系统之间的交互性会更强大,在大大提高cpu利用率的同时还会使程序员对各线程任务在处理过程中进行有效的把控和监督. 二.等待/通知机制 1."wait/notify"机制:等待/通知机制,wait使线程暂停运行,而notify 使暂停的线程继续运行.用一个厨师和服务员的交互来说明: (1) 服务员取到菜的时间取决于厨师,所以服务员就有“

MFC线程(三):线程同步事件(event)与互斥(mutex)

前面讲了临界区可以用来达到线程同步.而事件(event)与互斥(mutex)也同样可以做到. Win32 API中的线程事件 HANDLE hEvent = NULL; void MainTestFun{ hEvent = CreateEvent(NULL,FALSE,FALSE,NULL); SetEvent(hEvent); char g_charArray[4]; CString szResult; //下面三个线程中的任意一个访问g_charArray的时候其他线程都不能访问 AfxBe

JAVA多线程(三) 线程池和锁的深度化

github演示代码地址:https://github.com/showkawa/springBoot_2017/tree/master/spb-demo/src/main/java/com/kawa/thread 1.线程池 1.1 线程池是什么 Java中的线程池是运用场景最多的并发框架,几乎所有需要异步或并发执行任务的程序都可以使用线程池.在开发过程中,合理地使用线程池能够带来3个好处. 第一:降低资源消耗.通过重复利用已创建的线程降低线程创建和销毁造成的消耗. 第二:提高响应速度.当任务