介绍
在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 ()