在java项目中利用多线程怎么交替打印两个数

  介绍

在java项目中利用多线程怎么交替打印两个数吗?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

<强>方法1 强,使用等待和通知

包com.thread;
  
  公开课T01 {
  
  公共静态void main (String [] args) {
  char [] char1=癆AAAAA" .toCharArray ();
  char [] char2=癇BBBBB" .toCharArray ();
  对象对象=新对象();
  
  线程thread1=新线程(()→{
  同步(对象){//使用通知和等时,必须要选获取到锁
  for (int i=0;我& lt;char1.length;我+ +){
  尝试{
  System.out.print (char1[我]);
  object.notify ();
  object.wait ();
  }捕捉(InterruptedException e) {
  e.printStackTrace ();
  }
  }
  object.notify();//必须加上,否则程序无法结束,两个线程总有一个最后是等待状态,所以此处必须加
  }
  
  },“t1");
  
  
  线程thread2=新线程(()→{
  同步(对象){
  for (int i=0;我& lt;char2.length;我+ +){
  尝试{
  System.out.print (char2[我]);
  object.notify ();
  object.wait ();
  }捕捉(InterruptedException e) {
  e.printStackTrace ();
  }
  }
  object.notify ();
  }
  },“t2");
  
  thread1.start ();
  thread2.start ();
  
  }
  }

<>强方法2 强,使用LockSupport方法

包com.thread;
  
  进口java.util.concurrent.locks.LockSupport;
  
  公开课T02 {
  静态线程thread1;
  静态线程thread2;
  公共静态void main (String [] args) {
  char [] char1=癆AAAAA" .toCharArray ();
  char [] char2=癇BBBBB" .toCharArray ();
  
  thread1=新线程(()→{
  for (int i=0;我& lt;char1.length;我+ +){
  System.out.print (char1[我]);
  LockSupport.unpark (thread2);
  LockSupport.park ();
  }
  },“t1");
  
  thread2=新线程(()→{
  for (int i=0;我& lt;char2.length;我+ +){
  LockSupport.park ();
  System.out.print (char2[我]);
  LockSupport.unpark (thread1);
  }
  },“t2");
  
  thread1.start ();
  thread2.start ();
  
  }
  
  
  }

<>强方法3 强,使用CAS自旋锁

包com.thread;
  
  公开课T03 {
  enum ReadEnum {
  T1,
  T2;
  }
  静态稳定ReadEnum r=ReadEnum.T1;
  公共静态void main (String [] args) {
  char [] char1=癆AAAAA" .toCharArray ();
  char [] char2=癇BBBBB" .toCharArray ();
  线程thread1=新线程(()→{
  for (int i=0;我& lt;char1.length;我+ +){
  而(r !=ReadEnum.T1) {
  }
  System.out.print (char1[我]);
  r=ReadEnum.T2;
  }
  },“t1");
  
  
  线程thread2=新线程(()→{
  for (int i=0;我& lt;char2.length;我+ +){
  而(r !=ReadEnum.T2) {
  }
  System.out.print (char2[我]);
  r=ReadEnum.T1;
  }
  },“t2");
  
  thread1.start ();
  thread2.start ();
  
  
  }
  }

<>强方法4 强,使用条件方法

包com.thread;
  
  进口java.util.concurrent.locks.Condition;
  进口java.util.concurrent.locks.ReentrantLock;
  
  
  公开课T04 {
  
  公共静态void main (String [] args) {
  char [] char1=癆AAAAA" .toCharArray ();
  char [] char2=癇BBBBB" .toCharArray ();
  
  ReentrantLock锁=新的ReentrantLock ();
  条件condition1=lock.newCondition ();
  条件condition2=lock.newCondition ();
  
  线程thread1=新线程(()→{
  尝试{
  lock.lock ();
  for (int i=0;我& lt;char1.length;我+ +){
  System.out.print (char1[我]);
  condition2.signal();//唤醒线程2执行
  condition1.await();//线程1等待
  }
  condition2.signal ();
  }捕捉(异常e) {
  e.printStackTrace ();
  最后}{
  lock.unlock ();
  }
  },“t1");
  
  线程thread2=新线程(()→{
  尝试{
  lock.lock ();
  for (int i=0;我& lt;char2.length;我+ +){
  System.out.print (char2[我]);
  condition1.signal ();
  condition2.await ();
  }
  condition1.signal ();
  }捕捉(异常e) {
  e.printStackTrace ();
  最后}{
  lock.unlock ();
  }
  
  },“t2");
  
  thread1.start ();
  thread2.start ();
  
  
  }
  }

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

在java项目中利用多线程怎么交替打印两个数