java实现两个线程交替打印

互联网 19-12-24

使用ReentrantLock实现两个线程交替打印

实现字母在前数字在后

package com.study.pattern;  import java.util.concurrent.CountDownLatch; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock;  public class Demo2 {     private static Lock lock = new ReentrantLock();     private static Condition c1 = lock.newCondition();     private static Condition c2 = lock.newCondition();     private static CountDownLatch count = new CountDownLatch(1);     public static void main(String[] args) {        String c = "ABCDEFGHI";        char[] ca = c.toCharArray();        String n = "123456789";        char[] na = n.toCharArray();        Thread t1 = new Thread(() -> {            try {                lock.lock();                count.countDown();                for(char caa : ca) {                    c1.signal();                    System.out.print(caa);                    c2.await();                }                c1.signal();            } catch (InterruptedException e) {                e.printStackTrace();            } finally {                lock.unlock();            }        });        Thread t2 = new Thread(() -> {            try {                count.await();                lock.lock();                for(char naa : na) {                    c2.signal();                    System.out.print(naa);                    c1.await();                }                c2.signal();            } catch (InterruptedException e) {                e.printStackTrace();            } finally {                lock.unlock();            }        });        t1.start();        t2.start();     } }

最后输出结果:

免费学习视频教程推荐:java教学视频

使用LinkedTransferQueue实现两个线程交替打印

实现字母在前数字在后

package com.study.pattern;   import java.util.concurrent.LinkedTransferQueue;  public class Demo3 {     private static LinkedTransferQueue<Character> linkedC = new LinkedTransferQueue<Character>();     private static LinkedTransferQueue<Character> linkedN = new LinkedTransferQueue<Character>();     public static void main(String[] args) {         String c = "ABCDEFGHI";         char[] ca = c.toCharArray();         String n = "123456789";         char[] na = n.toCharArray();         Thread t1 = new Thread(() -> {             for(char caa : ca) {                 try {                     linkedC.put(caa);                     char a = linkedN.take();                     System.out.print(a);                 } catch (InterruptedException e) {                     e.printStackTrace();                 }             }         });         Thread t2 = new Thread(() -> {             for(char naa : na) {                 try {                     char b = linkedC.take();                     System.out.print(b);                     linkedN.put(naa);                 } catch (InterruptedException e) {                     e.printStackTrace();                 }             }         });         t1.start();         t2.start();      } }

输出结果:

使用synchronized实现两个线程交替打印

实现字母在前数字在后

package com.study.pattern;   import java.util.concurrent.CountDownLatch;  public class Demo4 {     private static CountDownLatch count = new CountDownLatch(1);     public static void main(String[] args) {         String c = "ABCDEFGHI";         char[] ca = c.toCharArray();         String n = "123456789";         char[] na = n.toCharArray();         Object lock = new Object();         Thread t1 = new Thread(() -> {             synchronized (lock) {                 count.countDown();                 for(char caa : ca) {                     System.out.print(caa);                     lock.notify();                     try {                         lock.wait();                     } catch (InterruptedException e) {                         e.printStackTrace();                     }                 }                 lock.notify();             }         });         Thread t2 = new Thread(() -> {             try {                 count.await();             } catch (InterruptedException e) {                 e.printStackTrace();             }             synchronized (lock) {                 for(char naa : na) {                     System.out.print(naa);                     lock.notify();                     try {                         lock.wait();                     } catch (InterruptedException e) {                         e.printStackTrace();                     }                 }                 lock.notify();             }         });         t1.start();         t2.start();     } }

输出结果:

使用LockSupport实现两个线程交替打印

实现字母在前数字在后

package com.study.pattern;   import java.util.concurrent.locks.LockSupport;  public class Demo5 {     private static Thread t1;     private static Thread t2;     public static void main(String[] args) {         String c = "ABCDEFGHI";         char[] ca = c.toCharArray();         String n = "123456789";         char[] na = n.toCharArray();         t1 = new Thread(() -> {             for(char caa : ca) {                 System.out.print(caa);                 LockSupport.unpark(t2);                 LockSupport.park();              }         });         t2 = new Thread(() -> {             for(char naa : na) {                 LockSupport.park();                 System.out.print(naa);                 LockSupport.unpark(t1);             }         });         t1.start();         t2.start();     } }

输出结果:

相关文章教程推荐:java零基础入门

以上就是java实现两个线程交替打印的详细内容,更多内容请关注技术你好其它相关文章!

来源链接:
免责声明:
1.资讯内容不构成投资建议,投资者应独立决策并自行承担风险
2.本文版权归属原作所有,仅代表作者本人观点,不代表本站的观点或立场
标签: 交替打印
上一篇:php获取远程图片并下载保存到本地的方法分析 下一篇:怎么在linux系统中安装配置phpmyadmin

相关资讯