I recently bought flower coffee. The beans were delivered with the coffee machine. The flowers were the osmanthus I bought during my trip to Yangshuo last week. I named it Sunday.
The coffee taste is a little lighter, with more fragrance of osmanthus.
Get to the point:
In this article, let’s study wait() notify() notifyAll().
DEMO1: wait() and notify()
public class Test { static class ThreadOne extends Thread { private Callback mCallback; @Override public void run() { work(); if (mCallback != null) { mCallback.onResult(false); } } // 耗时 3s private void work() { System.out.println(" 正在查询数据库 1"); long startTime = System.currentTimeMillis(); while (true) { if (System.currentTimeMillis() - startTime < 3000) { continue; } break; } } public void setCallback(Callback callback) { mCallback = callback; } public interface Callback { void onResult(boolean result); } } static class ThreadTest extends Thread { private Object mLock = new Object(); private ThreadOne mThreadOne; @Override public void run() { workOne(); System.out.println(" 根据结果继续做其他事情 "); } private void workOne() { mThreadOne = new ThreadOne(); mThreadOne.setCallback(new ThreadOne.Callback() { @Override public void onResult(boolean result) { System.out.println(" 查询数据库 1 结束,:" + (result ? " 有数据 " : " 无数据 ")); synchronized (mLock) { mLock.notify(); System.out.println("--ThreadTest 结束等待 --"); } } }); mThreadOne.start(); try { synchronized (mLock) { System.out.println("--ThreadTest 进入等待 --"); mLock.wait(); } } catch (InterruptedException e) { e.printStackTrace(); } } } public static void main(String[] var0) { ThreadTest threadTest = new ThreadTest(); threadTest.start(); } }
DEMO1 output:
--ThreadTest 进入等待-- 正在查询数据库 1 查询数据库 1 结束,: 无数据 --ThreadTest 结束等待-- 根据结果继续做其他事情
Note:
Using wait() and notify() must be in It can only be called after obtaining the synchronization lock. If it is called directly, a java.lang.IllegalMonitorStateException error will be reported because the state is protected by the synchronization lock.
wait() is different from sleep() in that wait() will release the synchronization lock.
Because wait() and notify() are implemented based on synchronization locks, each object has its own synchronization lock, so wait() and notify() are methods of Object, instead of Thread.
DEMO2, wait() and notifyAll():
public class Test { private static Object mLock = new Object(); static class MyThread extends Thread { String mName; Callback mCallback; public MyThread(String name){ mName = name; } @Override public void run() { work(); if (mCallback != null) { mCallback.onResult(false); } } // 耗时 3s private void work() { System.out.println(mName + " 等待 "); try { synchronized (mLock) { mLock.wait(); } } catch (InterruptedException e) { e.printStackTrace(); } } public void setCallback(Callback callback) { mCallback = callback; } public interface Callback { void onResult(boolean result); } } static class ThreadTest extends Thread { @Override public void run() { work("db1"); work("db2"); work("db3"); try { sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } synchronized (mLock) { System.out.println(" 唤醒全部 "); mLock.notifyAll(); } } private void work(String name) { final MyThread myThread = new MyThread(name); myThread.setCallback(new MyThread.Callback() { @Override public void onResult(boolean result) { System.out.println(myThread.mName + " 回来了 "); } }); myThread.start(); } } public static void main(String[] var0) { ThreadTest threadTest = new ThreadTest(); threadTest.start(); } }
DEMO2 output:
db1 等待 db3 等待 db2 等待 唤醒全部 db3 回来了 db1 回来了 db2 回来了
The wait() method of the same object can be called multiple times in different threads , which allows different threads to wait (block). You can notify() one by one, or you can call notifyAll() to wake them all up at once.
【Related recommendations】
1. Detailed explanation of Java multi-threading basics
2. About Java thread synchronization
3. Detailed explanation of Java thread synchronization and synchronization methods
The above is the detailed content of Share an example tutorial on the basics of Java multithreading. For more information, please follow other related articles on the PHP Chinese website!