两个线程交替运行的问题

mac2025-08-26  11

导航

两个线程交替运行的问题题目解法一:LockSupport解法解法二:LockCondition解法解法三:synchronized-wait-notify解法

两个线程交替运行的问题

题目

有两个数组A“123456”,B“abcdefg”,依次交替输出,例:1a2b3c…

解法一:LockSupport解法

import java.util.concurrent.locks.LockSupport; public class LockSupport_Demo { static Thread t1 = null, t2 = null; public static void main(String[] args) { char[] num = "123456".toCharArray(); char[] eng = "ABCDEF".toCharArray(); t1 = new Thread(() -> { for (char c : num) { System.out.println(c); LockSupport.unpark(t2); LockSupport.park(); } }); t2 = new Thread(() -> { for (char c : eng) { LockSupport.park(); System.out.println(c); LockSupport.unpark(t1); } }); t1.start(); t2.start(); } }

解析:两个线程一起start,jvm并不知道要先运行哪一个,所以在线程t2中一进入就用LockSupport.park()锁定,必然是先运行线程t1;之后执行完后把t2解锁,自己加锁,t2如此往复

运行结果:

解法二:LockCondition解法

import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class LockCondition_Demo { public static void main(String[] args) { char[] num = "123456".toCharArray(); char[] eng = "ABCDEF".toCharArray(); Lock lock = new ReentrantLock(); Condition conditionT1 = lock.newCondition(); Condition conditionT2 = lock.newCondition(); new Thread(() -> { try { lock.lock(); for (char c : num) { System.out.println(c); conditionT2.signal(); conditionT1.await(); } conditionT2.signal(); } catch (InterruptedException e) { e.printStackTrace(); } finally { lock.unlock(); } }, "t1").start(); new Thread(() -> { try { lock.lock(); for (char c : eng) { System.out.println(c); conditionT1.signal(); conditionT2.await(); } conditionT1.signal(); } catch (InterruptedException e) { e.printStackTrace(); } finally { lock.unlock(); } }, "t2").start();; } }

解法三:synchronized-wait-notify解法

public class Sync_wait_notify { public static void main(String[] args) { char[] num = "123456".toCharArray(); char[] eng = "ABCDEF".toCharArray(); final Object o = new Object(); new Thread(() -> { try { synchronized (o) { for (char c : num) { System.out.println(c); o.notify(); o.wait(); } o.notify(); } } catch (InterruptedException e) { e.printStackTrace(); } }, "t1").start(); new Thread(() -> { try { synchronized (o) { for (char c : eng) { System.out.println(c); o.notify(); o.wait(); } o.notify(); } } catch (InterruptedException e) { e.printStackTrace(); } }, "t2").start(); ; } }
最新回复(0)