当前位置:   article > 正文

有三个线程分别打印A、B、C,请用多线程编程实现,在屏幕上循环打印10次ABCABC…_a、b、c循环10次多线程

a、b、c循环10次多线程

题目:有三个线程分别打印A、B、C,请用多线程编程实现,在屏幕上循环打印10次ABCABC… 

方法一:使用lock和condition来实现a执行完通知b执行,b执行完通知c执行,c执行完通知a执行的顺序,使用Executors的fixedthreadpool,将三个线程放到线程池里面,使用线程池控制程序的结束,调用shutdown()方法。

  1. package com.ljf.thread.demo.lock;
  2. import java.util.concurrent.locks.Condition;
  3. import java.util.concurrent.locks.Lock;
  4. import java.util.concurrent.locks.ReentrantLock;
  5. public class Resources {
  6. public static String threadName="A";//默认值为A;
  7. public static Lock lock=new ReentrantLock();
  8. public static Condition conA=lock.newCondition();
  9. public static Condition conB=lock.newCondition();
  10. public static Condition conC=lock.newCondition();
  11. }
  12. package com.ljf.thread.demo.lock;
  13. public class ThreadA implements Runnable{
  14. public void run() {
  15. for(int k=0;k<10;k++){
  16. Resources.lock.lock();
  17. try {
  18. while(!Resources.threadName.equals("A")){
  19. try {
  20. Resources.conA.await();
  21. } catch (InterruptedException e) {
  22. e.printStackTrace();
  23. }
  24. }
  25. //打印信息
  26. System.out.println(String.format("这是第%d遍执行",k+1));
  27. System.out.println("A");
  28. //唤醒b
  29. Resources.threadName="B";
  30. Resources.conB.signal();
  31. } catch (Exception e) {
  32. e.printStackTrace();
  33. } finally {
  34. Resources.lock.unlock();
  35. }
  36. }
  37. }
  38. }
  39. package com.ljf.thread.demo.lock;
  40. public class ThreadB implements Runnable {
  41. public void run() {
  42. for(int k=0;k<10;k++){
  43. Resources.lock.lock();
  44. try {
  45. while(!Resources.threadName.equals("B")){
  46. try {
  47. Resources.conB.await();
  48. } catch (InterruptedException e) {
  49. e.printStackTrace();
  50. }
  51. }
  52. //打印信息
  53. System.out.println(String.format("这是第%d遍执行",k+1));
  54. System.out.println("B");
  55. //唤醒b
  56. Resources.threadName="C";
  57. Resources.conC.signal();
  58. } catch (Exception e) {
  59. e.printStackTrace();
  60. } finally {
  61. Resources.lock.unlock();
  62. }
  63. }
  64. }
  65. }
  66. package com.ljf.thread.demo.lock;
  67. public class ThreadC implements Runnable{
  68. public void run() {
  69. for(int k=0;k<10;k++){
  70. Resources.lock.lock();
  71. try {
  72. while(!Resources.threadName.equals("C")){
  73. try {
  74. Resources.conC.await();
  75. } catch (InterruptedException e) {
  76. e.printStackTrace();
  77. }
  78. }
  79. //打印信息
  80. System.out.println(String.format("这是第%d遍执行",k+1));
  81. System.out.println("C");
  82. //唤醒b
  83. Resources.threadName="A";
  84. Resources.conA.signal();
  85. } catch (Exception e) {
  86. e.printStackTrace();
  87. } finally {
  88. Resources.lock.unlock();
  89. }
  90. }
  91. }
  92. }
  93. package com.ljf.thread.demo.lock;
  94. import java.util.concurrent.ExecutorService;
  95. import java.util.concurrent.Executors;
  96. import java.util.concurrent.ThreadPoolExecutor;
  97. public class TestABC {
  98. public static void main(String args[]){
  99. ExecutorService es= Executors.newFixedThreadPool(3);
  100. es.execute(new ThreadA());
  101. es.execute(new ThreadB());
  102. es.execute(new ThreadC());
  103. es.shutdown();
  104. }
  105. }

结果:

这是第1遍执行
A
这是第1遍执行
B
这是第1遍执行
C
这是第2遍执行
A
这是第2遍执行
B
这是第2遍执行
C
这是第3遍执行
A
这是第3遍执行
B
这是第3遍执行
C
这是第4遍执行
A
这是第4遍执行
B
这是第4遍执行
C
这是第5遍执行
A
这是第5遍执行
B
这是第5遍执行
C
这是第6遍执行
A
这是第6遍执行
B
这是第6遍执行
C
这是第7遍执行
A
这是第7遍执行
B
这是第7遍执行
C
这是第8遍执行
A
这是第8遍执行
B
这是第8遍执行
C
这是第9遍执行
A
这是第9遍执行
B
这是第9遍执行
C
这是第10遍执行
A
这是第10遍执行
B
这是第10遍执行
C

Process finished with exit code 0

https://mouselearnjava.iteye.com/blog/1949228

方法二:使用lock,通过公共统计次数来做判断实现顺序打印的,一个线程释放锁之后,自己和其他线程同时还会去抢夺公共锁,拿到锁且while里面的判读条件满足之后,才能打印。

  1. package com.ljf.interview.thread;
  2. import java.util.concurrent.locks.ReadWriteLock;
  3. import java.util.concurrent.locks.ReentrantLock;
  4. public class Resource {
  5. public static int count=10;
  6. public static int cnt=0;
  7. public static ReentrantLock locks=new ReentrantLock();
  8. }
  9. package com.ljf.interview.thread;
  10. public class PrintA implements Runnable{
  11. @Override
  12. public void run() {
  13. for(int k=0;k<10;){
  14. try {
  15. Resource.locks.lock();
  16. System.out.println("aaaa");
  17. while (Resource.cnt % 3 == 0) {//多线程并发,不能用if,必须用循环测试等待条件,避免虚假唤醒
  18. System.out.print("A");
  19. Resource.cnt++;
  20. k++;
  21. }
  22. } finally {
  23. Resource.locks.unlock();// lock()和unlock()操作结合try/catch使用
  24. }
  25. }
  26. }
  27. }
  28. package com.ljf.interview.thread;
  29. public class PrintB implements Runnable {
  30. @Override
  31. public void run() {
  32. for (int k = 0; k < 10; ) {
  33. try {
  34. Resource.locks.lock();
  35. System.out.println("bbbb");
  36. while (Resource.cnt % 3 == 1) {//多线程并发,不能用if,必须用循环测试等待条件,避免虚假唤醒
  37. System.out.print("B");
  38. Resource.cnt++;
  39. k++;
  40. }
  41. } finally {
  42. Resource.locks.unlock();// lock()和unlock()操作结合try/catch使用
  43. }
  44. }
  45. }
  46. }
  47. package com.ljf.interview.thread;
  48. import java.util.concurrent.locks.ReadWriteLock;
  49. public class PrintC implements Runnable{
  50. @Override
  51. public void run() {
  52. for(int k=0;k<10;){
  53. try {
  54. Resource.locks.lock();
  55. System.out.println("ccc");
  56. while (Resource.cnt % 3 == 2) {//多线程并发,不能用if,必须用循环测试等待条件,避免虚假唤醒
  57. System.out.print("C");
  58. Resource.cnt++;
  59. k++;
  60. }
  61. } finally {
  62. Resource.locks.unlock();// lock()和unlock()操作结合try/catch使用
  63. }
  64. }
  65. }
  66. }
  67. package com.ljf.interview.thread;
  68. public class PrintTask {
  69. public static void main(String args[]){
  70. new Thread(new PrintA(),"1").start();
  71. new Thread(new PrintC(),"3").start();
  72. new Thread(new PrintB(),"2").start();
  73. }
  74. }

结果:

ABCABCABCABCABCABCABCABCABCABC

都看到这里了,就顺手点击左上角的【关注】按钮,点击右上角的小手,给个评论,关注一下,再走呗!☺

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/956244
推荐阅读
相关标签
  

闽ICP备14008679号