在Java中使用同步如何实现运行线程交替

  介绍

这篇文章将为大家详细讲解有关在Java中使用同步如何实现运行线程交替,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

<强>背景

用两个线程交替输出A - z和1-26,即一个线程输出无所不包的,另一个线程输出1-26

而且是交替形式

    <李>线程1输出,线程二输出1 <李>线程1输出B——线程二输出2 <李>线程1输出C——线程二输出3
      李,

以此类推

分析

主要考察线程之间的通信,思路就是创建两个线程

在一个线程输出一个内容之后,自己进入阻塞,去唤醒另一个线程

另一个线程同样,输出一个内容之后,自己进入阻塞,去唤醒另一个线程

<强>代码实现(一)

公共类AlternateCover {
  
  公共静态void main (String [] args) {
  
  最后一个char [] arrLetter=癆BCDEFGHIJKLMNOPQRSTUVWXYZ" .toCharArray ();
  最终String [] arrNumber={“1”,“2”、“3”、“4”、“5”、“6”、“7”、“8”,“9”,“10“,“11”,“12”、“13”、“14”、“15“,“16“,“17”、“18“,“19”、“20”,“21“,“22”,“23”、“24“,“25”,“26个“};
  
  threadRun (arrLetter arrNumber);
  }
  
  私有静态孔隙threadRun (char [] arrLetter, String [] arrNumber) {
  
  最后一个对象锁=新对象();//设置一个锁对象//打印arrNumber
  新线程(()→{
  同步(锁){
  (字符串:arrNumber) {
  system . out。打印(一个);
  尝试{
  lock.notify();//唤醒其他等待的线程此处唤醒arrLetter
  lock.wait ();//arrNumber自己进入等待让出CPU资源和锁资源
  }捕捉(InterruptedException e) {
  e.printStackTrace ();
  }
  }
  lock.notify ();
  }
  },“arrNumber“) .start ();//打印arrLetter
  新线程(()→{
  同步(锁){//获取对象锁
  (char: arrLetter) {
  System.out.print(一个);
  尝试{
  lock.notify();//唤醒其他等待的线程此处唤醒arrNumber
  lock.wait ();//arrLetter自己进入等待让出CPU资源和锁资源
  }捕捉(InterruptedException e) {
  e.printStackTrace ();
  }
  }
  lock.notify();//最后那个等待的线程需要被唤醒,否则程序无法结束
  }
  },“arrLetter“) .start ();
  
  }
  }

运行一下,确实实现了交替输出,但是多运行几次,就会发现问题

有时候是数字先输出,有时候是字母先输出

即两个线程谁先启动的顺序是不固定的

倘若试题中再加一句,必须要字母先输出,怎么办?

<强>代码实现(二)

/* *   *交替掩护必须保证大写字母先输出   */公开课AlternateCover {      公共静态不稳定的布尔flg=false;//谁先开始的标志挥发性修饰目的是让该值修改对所有线程可见,且防止指令重排序   公共静态void main (String [] args) {      最后一个char [] arrLetter=癆BCDEFGHIJKLMNOPQRSTUVWXYZ" .toCharArray ();   最终String [] arrNumber={“1”,“2”、“3”、“4”、“5”、“6”、“7”、“8”,“9”,“10“,“11”,“12”、“13”、“14”、“15“,“16“,“17”、“18“,“19”、“20”,“21“,“22”,“23”、“24“,“25”,“26个“};      threadRun (arrLetter arrNumber);   }      私有静态孔隙threadRun (char [] arrLetter, String [] arrNumber) {      最后一个对象锁=新对象();//锁对象//打印arrLetter   新线程(()→{   同步(锁){   如果(! flg){//如果flg是假的就将值设为true   flg=true;   }   (char: arrLetter) {   System.out.print (a);//输出内容   尝试{   lock.notify();//唤醒在等待的其他线程中的一个(此处也只有另一个)   lock.wait();//自己进入等待让出CPU资源和锁资源   }捕捉(InterruptedException e) {   e.printStackTrace ();   }   }   lock.notify();//最后那个等待的线程需要被唤醒,否则程序无法结束   }   },“arrLetter") .start ();//打印arrNumber   新线程(()→{   同步(锁){   如果(! flg){//倘若是该线程先执行,那么flg次数还是假的就先等着   尝试{   lock.wait ();   }捕捉(InterruptedException e) {   e.printStackTrace ();   }   }      (字符串:arrNumber) {   system . out。打印(一个);   尝试{   lock.notify ();   lock.wait ();   }捕捉(InterruptedException e) {   e.printStackTrace ();   }   }   lock.notify ();   }   },“arrNumber") .start ();      }      }

在Java中使用同步如何实现运行线程交替