介绍
这篇文章将为大家详细讲解有关在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中使用同步如何实现运行线程交替