LockSupport:
package com.company; import java.util.concurrent.locks.LockSupport; public class Main { static Thread t1, t2; public static void main(String[] args) throws Exception { char[] ca1 = "abcdefg".toCharArray(); char[] ca2 = "1234567".toCharArray(); t2 = new Thread(() -> { for (char ch : ca2) { LockSupport.park(); System.out.println(ch); LockSupport.unpark(t1); } }); t1 = new Thread(() -> { for (char ch : ca1) { System.out.println(ch); LockSupport.unpark(t2); LockSupport.park(); } }); t1.start(); t2.start(); } }
结果:
a 1 b 2 c 3 d 4 e 5 f 6 g 7
wait/notify:
package com.company; public class Main { static Thread t1, t2; public static void main(String[] args) throws Exception { char[] ca1 = "abcdefg".toCharArray(); char[] ca2 = "1234567".toCharArray(); String object = "lock"; t2 = new Thread(() -> { for (char ch : ca2) { synchronized (object) { object.notify(); System.out.println(ch); try { object.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } } System.out.println("t2 end"); }); t1 = new Thread(() -> { for (char ch : ca1) { synchronized (object) { System.out.println(ch); try { object.wait(); } catch (InterruptedException e) { e.printStackTrace(); } object.notify(); } } System.out.println("t1 end"); }); t1.start(); t2.start(); } }
Condition:
package com.company; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.ReentrantLock; public class Main { static Thread t1, t2; public static void main(String[] args) throws Exception { char[] ca1 = "abcdefg".toCharArray(); char[] ca2 = "1234567".toCharArray(); ReentrantLock reentrantLock = new ReentrantLock(); Condition c1 = reentrantLock.newCondition(); Condition c2 = reentrantLock.newCondition(); t2 = new Thread(() -> { for (char ch : ca2) { try { reentrantLock.lock(); c2.signal(); System.out.println(ch); try { c1.await(); } catch (InterruptedException e) { e.printStackTrace(); } } finally { reentrantLock.unlock(); } } System.out.println("t2 end"); }); t1 = new Thread(() -> { for (char ch : ca1) { try { reentrantLock.lock(); try { c2.await(); System.out.println(ch); } catch (InterruptedException e) { e.printStackTrace(); } c1.signal(); } finally { reentrantLock.unlock(); } } System.out.println("t1 end"); }); t1.start(); t2.start(); } }
TransferQueue:
package com.company; import java.util.concurrent.LinkedTransferQueue; import java.util.concurrent.TransferQueue; public class Main { static Thread t1, t2; public static void main(String[] args) throws Exception { char[] ca1 = "abcdefg".toCharArray(); char[] ca2 = "1234567".toCharArray(); TransferQueuequeue = new LinkedTransferQueue<>(); t2 = new Thread(() -> { for (char ch : ca2) { try { queue.transfer(ch); System.out.println(queue.take()); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println("t2 end"); }); t1 = new Thread(() -> { for (char ch : ca1) { try { System.out.println(queue.take()); queue.transfer(ch); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println("t1 end"); }); t1.start(); t2.start(); } }