java多线程顺序执行并顺序输出ABC问题

1.有A、B、C、D四个线程,A线程输出A, B线程输出B, C线程输出C,D线程输出D,要求, 同时启动四个线程, 按顺序输出ABCD;

本题主要通过join方法来实现顺序输出ABCD。

代码如下:

1package thread; 2 3/** 4 * @author Beauxie 5 */ 6public class TestThread1 { 7 8 public static void main(String[] args) { 9 10 // 线程A 11 final Thread a = new Thread(new Runnable() { 12 13 @Override 14 public void run() { 15 System.out.println("A"); 16 17 } 18 }); 19 20 // 线程B 21 final Thread b = new Thread(new Runnable() { 22 @Override 23 public void run() { 24 try { 25 // 执行b线程之前,加入a线程,让a线程执行 26 a.join(); 27 } catch (InterruptedException e) { 28 e.printStackTrace(); 29 } 30 System.out.println("B"); 31 32 } 33 }); 34 35 // 线程C 36 final Thread c = new Thread(new Runnable() { 37 38 @Override 39 public void run() { 40 try { 41 // 执行c线程之前,加入b线程,让b线程执行 42 b.join(); 43 } catch (InterruptedException e) { 44 e.printStackTrace(); 45 } 46 System.out.println("C"); 47 48 } 49 }); 50 51 // 线程D 52 Thread d = new Thread(new Runnable() { 53 54 @Override 55 public void run() { 56 try { 57 // 执行d线程之前,加入c线程,让c线程执行 58 c.join(); 59 } catch (InterruptedException e) { 60 e.printStackTrace(); 61 } 62 System.out.println("D"); 63 } 64 }); 65 66 // 启动四个线程 67 a.start(); 68 b.start(); 69 c.start(); 70 d.start(); 71 72 } 73 74}

运行结果:

2.有A,B,C三个线程, A线程输出A, B线程输出B, C线程输出C  要求, 同时启动三个线程, 按顺序输出ABC, 循环10次;

代码如下:

1package thread; 2 3import java.util.concurrent.locks.Lock; 4import java.util.concurrent.locks.ReentrantLock; 5 6/** 7 * @author Beauxie 8 */ 9public class TestThresd2 { 10 11 // //通过JDK5中的锁来保证线程的访问的互斥 12 private static Lock lock = new ReentrantLock(); 13 14 private static int state = 0;// 用state来判断轮到谁执行 15 16 private static final int RUN_NUMBER=100;//表示循环的次数 17 18 //A线程 19 static class ThreadA extends Thread { 20 21 @Override 22 public void run() { 23 for (int i = 0; i < RUN_NUMBER;) { 24 lock.lock();//获取锁定 25 if (state % 3 == 0) { 26 System.out.println("第"+(i+1)+"次:"); 27 System.out.println("A"); 28 state++; 29 i++; 30 } 31 lock.unlock();//释放锁定,不释放锁定,会被该线程一直保持 32 } 33 } 34 } 35 //B线程 36 static class ThreadB extends Thread { 37 38 @Override 39 public void run() { 40 for (int i = 0; i < RUN_NUMBER;) { 41 lock.lock(); 42 if (state % 3 ==1) { 43 System.out.println("B"); 44 state++; 45 i++; 46 } 47 lock.unlock(); 48 } 49 } 50 } 51 //C线程 52 static class ThreadC extends Thread { 53 54 @Override 55 public void run() { 56 for (int i = 0; i < RUN_NUMBER;) { 57 lock.lock(); 58 if (state % 3 == 2) { 59 System.out.println("C"); 60 state++; 61 i++; 62 } 63 lock.unlock(); 64 } 65 } 66 } 67 public static void main (String[] args){ 68 new ThreadA().start(); 69 new ThreadB().start(); 70 new ThreadC().start(); 71 } 72 73}

在这里我将循环次数改成100次,运行结果:

本题参考自:http://love3400wind.blog.163.com/blog/static/796308012013117102941831/

如果各位有更好的思路,麻烦请告诉我,谢谢!

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

4、jstack查看线程栈信息

1、介绍利用jps、top、jstack命令找到进程中耗时最大的线程,以及线程状态等等,同时最后还可以显示出死锁的线程查找:FoundoneJavaleveldeadlock即可1、jps获得进程号!(https://oscimg.oschina.net/oscnet/da00a309fa6

Java16周作业

题目1:编写一个应用程序,利用Java多线程机制,实现时间的同步输出显示。/\使用Runnable接口使用类创建线程对象,重写run()方法\\/代码publicclasstimetext{publicstaticvoidmain(Stringargs){Threa

FLV文件格式

1.        FLV文件对齐方式FLV文件以大端对齐方式存放多字节整型。如存放数字无符号16位的数字300(0x012C),那么在FLV文件中存放的顺序是:|0x01|0x2C|。如果是无符号32位数字300(0x0000012C),那么在FLV文件中的存放顺序是:|0x00|0x00|0x00|0x01|0x2C。2.