线程之间的通信 笔记
-
先A线程工作 再B线程工作
思路:使用对象锁,A先占用对象锁,使用后释放再给B
public class Test { private static Object lock = new Object(); static class ThreadA implements Runnable { @Override public void run() { synchronized (lock) { for (int i = 0; i < 100; i++) { System.out.println("Thread A " + i); } } } } static class ThreadB implements Runnable { @Override public void run() { synchronized (lock) { for (int i = 0; i < 100; i++) { System.out.println("Thread B " + i); } } } } public static void main(String[] args) throws InterruptedException { new Thread(new ThreadA()).start(); new Thread(new ThreadB()).start(); } }
-
A线程打印偶数,B线程打印奇数
思路:利用volatile+synchronized,因为a++不是原子操作,要加锁
public class Test { private static Object lock = new Object(); private static volatile int a = 0; static class ThreadA implements Runnable { @Override public void run() { while(a<100){ if(a%2==1){ try { System.out.println("ThreadA: " + a); synchronized (lock){ a++; } } catch (Exception e) { e.printStackTrace(); } } } } } static class ThreadB implements Runnable { @Override public void run() { while(a<100){ if(a%2==0){ try { System.out.println("ThreadB: " + a); synchronized (lock){ a++; } } catch (Exception e) { e.printStackTrace(); } } } } } public static void main(String[] args) { new Thread(new ThreadA()).start(); new Thread(new ThreadB()).start(); } }