notify wait 通信
package com.test.TongXinTest;
/**
* @author tli2
* @createDate 2022/5/11 13:08
*/
public class notifyAndWaitTest {
public static Object object = new Object();
public static void main(String[] args) throws InterruptedException {
Thread1 thread1 = new Thread1();
Thread2 thread2 = new Thread2();
thread1.start();
Thread.sleep(2000);
thread2.start();
}
static class Thread1 extends Thread {
@Override
public void run() {
synchronized (object) {
System.out.println("线程" + Thread.currentThread().getName()
+ "获取到了锁...");
try {
System.out.println("线程" + Thread.currentThread().getName()
+ "阻塞并释放锁...");
object.wait();
} catch (InterruptedException e) {
}
System.out.println("线程" + Thread.currentThread().getName()
+ "执行完成...");
}
}
}
static class Thread2 extends Thread {
@Override
public void run() {
synchronized (object) {
System.out.println("线程" + Thread.currentThread().getName()
+ "获取到了锁...");
object.notify();
System.out.println("线程" + Thread.currentThread().getName()
+ "唤醒了正在wait的线程...");
}
System.out
.println("线程" + Thread.currentThread().getName() + "执行完成...");
}
}
}
lock 介绍
package com.test.TongXinTest;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/**
* @author tli2
* @createDate 2022/5/11 13:23
*/
class ServiceA {
private Lock lock = new ReentrantLock();
public void testLock() {
lock.lock();
for (int i = 0; i < 3; i++) {
System.out.println("Thread " + Thread.currentThread().getName() + " index " + (i + 1));
}
lock.unlock();
}
}
class ThreadA extends Thread {
private ServiceA serviceA;
public ThreadA(ServiceA serviceA) {
this.serviceA = serviceA;
}
@Override
public void run() {
serviceA.testLock();
}
}
public class lockConditionTest {
public static void main(String[] args) {
ServiceA serviceA = new ServiceA();
ThreadA threadA1 = new ThreadA(serviceA);
ThreadA threadA2 = new ThreadA(serviceA);
ThreadA threadA3 = new ThreadA(serviceA);
ThreadA threadA4 = new ThreadA(serviceA);
ThreadA threadA5 = new ThreadA(serviceA);
threadA1.start();
threadA2.start();
threadA3.start();
threadA4.start();
threadA5.start();
}
}
lock+condition 通信(待继续了解)
package com.test.TongXinTest;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/**
* @author tli2
* @createDate 2022/5/11 13:57
*/
public class lockConditionTest2 {
public static void main(String[] args) throws InterruptedException {
ServiceB serviceB = new ServiceB();
ThreadB threadB = new ThreadB(serviceB);
threadB.start();
Thread.sleep(1000);
serviceB.testSignal();
}
}
class ServiceB {
private Lock lock = new ReentrantLock();
Condition condition = lock.newCondition();
public void testAwait() {
lock.lock();
try {
System.out.println("await before");
System.out.println("Thread " + Thread.currentThread().getName());
condition.await();
System.out.println("await after");
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
public void testSignal() {
lock.lock();
try {
System.out.println("Thread " + Thread.currentThread().getName() + "---singal");
condition.signal();
} catch (Exception e) {
e.printStackTrace();
}finally {
lock.unlock();
}
}
}
class ThreadB extends Thread {
private ServiceB serviceB;
public ThreadB(ServiceB serviceB) {
this.serviceB = serviceB;
}
@Override
public void run() {
serviceB.testAwait();
}
}
参考
深入理解Java中的wait() 方法
https://blog.csdn.net/qq_37855749/article/details/117073990