写法1,使用LockSupport完成
public class T02_00_LockSupport { static Thread t1 = null, t2 = null; public static void main(String[] args) throws Exception { char[] aI = "1234567".toCharArray(); char[] aC = "ABCDEFG".toCharArray(); t1 = new Thread(() -> { for (char c : aI) { System.out.print(c); LockSupport.unpark(t2); //叫醒T2 LockSupport.park(); //T1阻塞 当前线程阻塞 } }, "t1"); t2 = new Thread(() -> { for (char c : aC) { LockSupport.park(); //t2挂起 System.out.print(c); LockSupport.unpark(t1); //叫醒t1 } }, "t2"); t1.start(); t2.start(); } }
写法二:使用syschronized完成,其中countDownLatch和开头定义的boolean变量是两种让那个线程先打印的方式
public class T07_00_sync_wait_notify { //private static volatile boolean t2Started = false; private static CountDownLatch latch = new CountDownLatch(1); public static void main(String[] args) { final Object o = new Object(); char[] aI = "1234567".toCharArray(); char[] aC = "ABCDEFG".toCharArray(); new Thread(() -> { try { latch.await(); } catch (InterruptedException e) { e.printStackTrace(); } synchronized (o) { // while(!t2Started) { // try { // o.wait(); // } catch (InterruptedException e) { // e.printStackTrace(); // } // } for (char c : aI) { System.out.print(c); try { o.notify(); o.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } o.notify(); } }, "t1").start(); new Thread(() -> { synchronized (o) { for (char c : aC) { System.out.print(c); latch.countDown(); //t2Started = true; try { o.notify(); o.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } o.notify(); } }, "t2").start(); } }
写法三:lock锁实现方式
public class ThreadTask{ public static void main(String[] args) { char[] aI = "1234567".toCharArray(); char[] aC = "ABCDEFG".toCharArray(); Lock lock = new ReentrantLock(); Condition condition = lock.newCondition(); new Thread(() -> { try { lock.lock(); for (char c : aI) { System.out.print(c); condition.signal(); condition.await(); } condition.signal(); /**为了防止最后有线程被锁住*/ } catch (Exception e) { e.printStackTrace(); } finally { lock.unlock(); } }, "t1").start(); new Thread(() -> { try { lock.lock(); //synchronized for (char c : aC) { System.out.print(c); condition.signal(); //o.notify condition.await(); //o.wait } condition.signal(); } catch (Exception e) { e.printStackTrace(); } finally { lock.unlock(); } }, "t2").start(); } }
lock锁的两个等待线程队列实现:
public class T09_00_lock_condition { public static void main(String[] args) { char[] aI = "1234567".toCharArray(); char[] aC = "ABCDEFG".toCharArray(); Lock lock = new ReentrantLock(); Condition conditionT1 = lock.newCondition(); //队列 Condition conditionT2 = lock.newCondition(); CountDownLatch latch = new CountDownLatch(1); new Thread(() -> { try { latch.await(); } catch (InterruptedException e) { e.printStackTrace(); } lock.lock(); try { for (char c : aI) { System.out.print(c); conditionT2.signal(); conditionT1.await(); } conditionT2.signal(); } catch (Exception e) { e.printStackTrace(); } finally { lock.unlock(); } }, "t1").start(); new Thread(() -> { lock.lock(); try { for (char c : aC) { System.out.print(c); latch.countDown(); conditionT1.signal(); conditionT2.await(); } conditionT1.signal(); } catch (Exception e) { e.printStackTrace(); } finally { lock.unlock(); } }, "t2").start(); } }
写法四:TransferQuery实现
public class T13_TransferQueue { public static void main(String[] args) { char[] aI = "1234567".toCharArray(); char[] aC = "ABCDEFG".toCharArray(); TransferQueue<Character> queue = new LinkedTransferQueue<Character>(); new Thread(() -> { try { for (char c : aI) { System.out.print(queue.take());//如果队列中没有值,就会阻塞,等待队列中有值之后才往下执行 queue.transfer(c);//向队列中添加值 } } catch (InterruptedException e) { e.printStackTrace(); } }, "t1").start(); new Thread(() -> { try { for (char c : aC) { queue.transfer(c); System.out.print(queue.take()); } } catch (InterruptedException e) { e.printStackTrace(); } }, "t2").start(); } }
写法五:使用阻塞队列完成
public class T04_00_BlockingQueue { static BlockingQueue<String> q1 = new ArrayBlockingQueue(1); static BlockingQueue<String> q2 = new ArrayBlockingQueue(1); public static void main(String[] args) throws Exception { char[] aI = "1234567".toCharArray(); char[] aC = "ABCDEFG".toCharArray(); new Thread(() -> { for (char c : aI) { System.out.print(c); try { q1.put("ok"); q2.take(); } catch (InterruptedException e) { e.printStackTrace(); } } }, "t1").start(); new Thread(() -> { for (char c : aC) { try { q1.take(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.print(c); try { q2.put("ok"); } catch (InterruptedException e) { e.printStackTrace(); } } }, "t2").start(); } }
写法六:使用cas方式完成
public class T03_00_cas { enum ReadyToRun {T1, T2} static volatile ReadyToRun r = ReadyToRun.T1; //思考为什么必须volatile public static void main(String[] args) { char[] aI = "1234567".toCharArray(); char[] aC = "ABCDEFG".toCharArray(); new Thread(() -> { for (char c : aI) { while (r != ReadyToRun.T1) { } System.out.print(c); r = ReadyToRun.T2; } }, "t1").start(); new Thread(() -> { for (char c : aC) { while (r != ReadyToRun.T2) { } System.out.print(c); r = ReadyToRun.T1; } }, "t2").start(); } }
写法七,使用AtomicInteger完成,和自旋锁相似
public class T05_00_AtomicInteger { static AtomicInteger threadNo = new AtomicInteger(1); public static void main(String[] args) { char[] aI = "1234567".toCharArray(); char[] aC = "ABCDEFG".toCharArray(); new Thread(() -> { for (char c : aI) { while (threadNo.get() != 1) { } System.out.print(c); threadNo.set(2); } }, "t1").start(); new Thread(() -> { for (char c : aC) { while (threadNo.get() != 2) { } System.out.print(c); threadNo.set(1); } }, "t2").start(); } }
原文:https://www.cnblogs.com/baierhu/p/14880916.html