线程通信
合理的使用Java多线程可以更好地利用服务器资源。一般来讲,线程内部有自己私有的线程上下文,互不干扰。但是当我们需要多个线程之间相互协作的时候,就需要我们掌握Java线程的通信方式。本文将介绍Java线程之间的几种通信原理。
锁同步机制
使用synchronized
public class lockSyn {
    static class ThreadA implements Runnable{
        @Override
        public void run() {
            synchronized (this) {
                for (int i = 0; i < 10; i++) {
                    System.out.println("ThreadA " + i);
                }
            }
        }
    }
    static class ThreadB implements Runnable{
        @Override
        public void run() {
            synchronized (this) {
                for (int i = 0; i < 10; i++) {
                    System.out.println("ThreadB " + i);
                }
            }
        }
    }
    public static void main(String[] args) throws InterruptedException {
        new Thread(new ThreadA()).start();
        Thread.sleep(1000);
        new Thread(new ThreadB()).start();
    }
}
这段程序能够保证先执行线程A,之后再执行线程B。
等待/通知机制
使用wait()/notify()机制
public class waitNotify {
    private static Object lock = new Object();
    static class A implements Runnable{
        @Override
        public void run() {
            synchronized (lock){
                for (int i = 0; i < 5; i++) {
                    System.out.println("A:" + i);
                    lock.notify();
                    try {
                        lock.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                lock.notify();
            }
        }
    }
    static class B implements Runnable{
        @Override
        public void run() {
            synchronized (lock){
                for (int i = 0; i < 5; i++) {
                    System.out.println("B:" + i);
                    lock.notify();
                    try {
                        lock.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                lock.notify();
            }
        }
    }
    public static void main(String[] args) throws InterruptedException {
        new Thread(new A()).start();
        Thread.sleep(1000);
        new Thread(new B()).start();
    }
}
wait(): 会释放锁。
信号量机制
使用volatile定义信号量(涉及JMM—-Java内存模型)
public class semaphore {
    private static volatile int signal = 0;
    static class ThreadA implements Runnable{
        @Override
        public void run() {
            while (signal < 10){
                if(signal % 2 == 0){
                    System.out.println("ThreadA: " + signal);
                    signal++;
                }
            }
        }
    }
    static class ThreadB implements Runnable{
        @Override
        public void run() {
            while (signal < 10){
                if(signal % 2 == 1){
                    System.out.println("ThreadB: "+ signal);
                    signal++;
                }
            }
        }
    }
    public static void main(String[] args) throws InterruptedException {
        new Thread(new ThreadA()).start();
        Thread.sleep(1000);
        new Thread(new ThreadB()).start();
    }
}