java实现多线程交替打印两个数

本文实例为大家分享了java实现多线程交替打印两个数的具体代码,供大家参考,具体内容如下

方法1、使用wait和notify

package com.thread;

public class T01 {

 public static void main(String[] args) {
 char[] char1 = "AAAAAA".toCharArray();
 char[] char2 = "BBBBBB".toCharArray();
 Object object = new Object();

 Thread thread1 = new Thread(() -> {
  synchronized(object){//使用notify和wait时,必须要选获取到锁
   for (int i = 0; i < char1.length; i++) {
   try {
    System.out.print(char1[i]);
    object.notify();
    object.wait();
   } catch (InterruptedException e) {
    e.printStackTrace();
   }
   }
   object.notify();//必须加上,否则程序无法结束,两个线程总有一个最后是wait状态,所以此处必须加
  }

 },"t1");

 Thread thread2 = new Thread( () -> {
  synchronized(object){
   for (int i = 0; i < char2.length; i++) {
   try {
    System.out.print(char2[i]);
    object.notify();
    object.wait();
   } catch (InterruptedException e) {
    e.printStackTrace();
   }
   }
   object.notify();
  }
 },"t2");

 thread1.start();
 thread2.start();

 }
}

方法2、使用LockSupport方法

package com.thread;

import java.util.concurrent.locks.LockSupport;

public class T02 {
 static Thread thread1 ;
 static Thread thread2 ;
 public static void main(String[] args) {
 char[] char1 = "AAAAAA".toCharArray();
 char[] char2 = "BBBBBB".toCharArray();

 thread1 = new Thread(() -> {
  for (int i = 0; i < char1.length; i++) {
   System.out.print(char1[i]);
   LockSupport.unpark(thread2);
   LockSupport.park();
  }
 },"t1");

  thread2 = new Thread(() -> {
  for (int i = 0; i < char2.length; i++) {
   LockSupport.park();
   System.out.print(char2[i]);
   LockSupport.unpark(thread1);
  }
 },"t2");

 thread1.start();
 thread2.start();

 }

}

方法3、使用CAS自旋锁

package com.thread;

public class T03 {
 enum ReadEnum{
 T1,
 T2;
 }
 static volatile ReadEnum r = ReadEnum.T1;
 public static void main(String[] args) {
 char[] char1 = "AAAAAA".toCharArray();
 char[] char2 = "BBBBBB".toCharArray();
 Thread thread1 = new Thread(() ->{
  for (int i = 0; i < char1.length; i++) {
  while (r != ReadEnum.T1) {
  }
  System.out.print(char1[i]);
  r = ReadEnum.T2;
  }
 },"t1");

 Thread thread2 = new Thread(() ->{
  for (int i = 0; i < char2.length; i++) {
  while (r != ReadEnum.T2) {
  }
  System.out.print(char2[i]);
  r = ReadEnum.T1;
  }
 },"t2");

 thread1.start();
 thread2.start();

 }
}

方法4、使用Condition方法

package com.thread;

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;

public class T04 {

 public static void main(String[] args) {
 char[] char1 = "AAAAAA".toCharArray();
 char[] char2 = "BBBBBB".toCharArray();

 ReentrantLock lock = new ReentrantLock();
 Condition condition1 = lock.newCondition();
 Condition condition2 = lock.newCondition();

 Thread thread1 = new Thread(() ->{
  try {
  lock.lock();
  for (int i = 0; i < char1.length; i++) {
   System.out.print(char1[i]);
   condition2.signal();//唤醒线程2执行
   condition1.await();//线程1等待
  }
  condition2.signal();
  }catch (Exception e) {
  e.printStackTrace();
  }finally{
  lock.unlock();
  }
 },"t1");

 Thread thread2 = new Thread(() ->{
  try {
  lock.lock();
  for (int i = 0; i < char2.length; i++) {
   System.out.print(char2[i]);
   condition1.signal();
   condition2.await();
  }
  condition1.signal();
  } catch (Exception e) {
  e.printStackTrace();
  }finally{
  lock.unlock();
  }

 },"t2");

 thread1.start();
 thread2.start();

 }
}

Condition与notify相比的好处是,Condition可以指定需要唤醒的线程,而notify是无法指定的,只能随机唤醒一个或者全唤醒(notifyAll)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Java实现多线程轮流打印1-100的数字操作

    首先打印1-100数字如果用一个单线程实现那么只要一个for循环即可,那么如果要用两个线程打印出来呢?(一个线程打印奇数,一个线程打印偶数)于是大家会想到可以通过加锁实现,但是这样的效率是不是不高?这里我用一个变量来控制两个线程的输出 public class ThreadTest { volatile int flag=0; public void runThread() throws InterruptedException{ Thread t1=new Thread(new Thread1

  • Java多线程通信:交替打印ABAB实例

    使用wait()和notify()实现Java多线程通信:两个线程交替打印A和B,如ABABAB public class Test { public static void main(String[] args) { final PrintAB print = new PrintAB(); new Thread(new Runnable() { public void run(){ for(int i=0;i<5;i++) { print.printA(); } } }).start(); n

  • java实现多线程交替打印

    本文实例为大家分享了java实现多线程交替打印的具体代码,供大家参考,具体内容如下 notify+wait实现 import org.junit.Test; import java.util.concurrent.*; public class TestThreadLocal { Object o = new Object(); CountDownLatch c=new CountDownLatch(2); @Test public void vvvvvvvv() throws Interrup

  • Java 实现多线程切换等待唤醒交替打印奇偶数

    引言 在日常工作生活中,可能会有用时几个人或是很多人干同一件事,在java编程中,同样也会出现类似的情况,多个线程干同样一个活儿,比如火车站买票系统不能多个人买一到的是同一张票,当某个窗口(线程)在卖某一张票的时候,别的窗口(线程)不允许再卖此张票了,在此过程中涉及到一个锁和资源等待的问题,如何合理正确的让线程与线程在干同一件事的过程中,不会抢资源以及一个一直等待一个一直干活的状况,接下来就聊一下多线程的等待唤醒以及切换的过程,在此就以A和B两个线程交替打印奇偶数的例子为例,代码如下: pack

  • Java多线程实战之交叉打印的两种方法

    要求效果:先打印5次"printA-",再打印5次"printB-",每次打印间隔1秒,重复循环20次 方式一:使用wait()和notifyAll()方法 public class MyService { private volatile boolean flag = false; public synchronized void printA() { try { while (flag) { wait(); } for (int i = 0; i < 5;

  • Java多线程连续打印abc实现方法详解

    一道编程题如下: 实例化三个线程,一个线程打印a,一个线程打印b,一个线程打印c,三个线程同时执行,要求打印出10个连着的abc. 题目分析: 通过题意我们可以得出,本题需要我们使用三个线程,三个线程分别会打印6次字符,关键是如何保证顺序一定是abc...呢.所以此题需要同步机制来解决问题! 令打印字符A的线程为ThreadA,打印B的ThreadB,打印C的为ThreadC.问题为三线程间的同步唤醒操作,主要的目的就是使程序按ThreadA->ThreadB->ThreadC->Thr

  • java实现多线程交替打印两个数

    本文实例为大家分享了java实现多线程交替打印两个数的具体代码,供大家参考,具体内容如下 方法1.使用wait和notify package com.thread; public class T01 { public static void main(String[] args) { char[] char1 = "AAAAAA".toCharArray(); char[] char2 = "BBBBBB".toCharArray(); Object object

  • python使用threading.Condition交替打印两个字符

    Python中使用threading.Condition交替打印两个字符的程序. 这个程序涉及到两个线程的的协调问题,两个线程为了能够相互协调运行,必须持有一个共同的状态,通过这个状态来维护两个线程的执行,通过使用threading.Condition对象就能够完成两个线程之间的这种协调工作. threading.Condition默认情况下会通过持有一个ReentrantLock来协调线程之间的工作,所谓可重入锁,是只一个可以由一个线程递归获取的锁,此锁对象会维护当前锁的所有者(线程)和当前所

  • Java 用两个线程交替打印数字和字母

    前一段时间听马士兵老师讲课,讲到某公司的一个面试,两个线程,其中一个线程输出ABC,另一个线程输出123,如何控制两个线程交叉输出1A2B3C,由于本人多线程掌握的一直不是很好,所以听完这道题,个人感觉收获良多,这是一个学习笔记.这道题有多种解法,不过有些属于纯炫技,所以只记录常见的三种解法.首先看第一种 1. park 和 unpark package cn.bridgeli.demo;   import com.google.common.collect.Lists;   import ja

  • java实现两个线程交替打印的实例代码

    使用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 c

  • Java五种方式实现多线程循环打印问题

    目录 wait-notify join方式 ReentrantLock ReentrantLock+Condition Semaphore 三个线程T1.T2.T3轮流打印ABC,打印n次,如ABCABCABCABC- N个线程循环打印1-100- wait-notify 循环打印问题可以通过设置目标值,每个线程想打印目标值,如果拿到锁后这次轮到的数不是它想要的就进入wait class Wait_Notify_ABC { private int num; private static fina

  • java求两个数中的大数(实例讲解)

    java中的max函数在Math中 应用如下: int a=34: int b=45: int ans=Math.max(34,45); 那么ans的值就是45. 以上这篇java求两个数中的大数(实例讲解)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们.

随机推荐