Javaマルチスレッドベーススレッドの待ち時間と起動(wait、notify、notifyAll)
4527 ワード
本稿では、wait()notify()notifyAllを研究します。
DEMO 1:wait()とnotify()
wait()とnotify()を使用すると、同期ロックを獲得した後に呼び出さなければなりません。直接呼び出したら、Java.lang.Illegel MonitonterStationエラーが発生します。状態は同期ロックによって保護されます。
wait()はsleep()とは違ってwait()が同期ロックを解除します。
wait()とnotify()は同期ロックに基づいて実現されるので、対象ごとに自分の同期ロックがあるので、wait()とnotify()はObjectの方法で、Threadではありません。
DEMO 2,wait()とnotifyAll():
db 1待ち
db 3待ち
db 2待ち
すべてを呼び覚ます
db 3帰ってきました
帰ってきました
db 2帰ってきました
同じオブジェクトのwait()方法は、複数の異なるスレッドで呼び出すことができ、異なるスレッドを待つ(ブロックする)ことができます。一つのnotify()もいいし、notifyAll()も呼び出されます。
DEMO 1:wait()と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();
}
}
DEMO 1出力:
--ThreadTest --
1
1 ,:
--ThreadTest --
注意:wait()とnotify()を使用すると、同期ロックを獲得した後に呼び出さなければなりません。直接呼び出したら、Java.lang.Illegel MonitonterStationエラーが発生します。状態は同期ロックによって保護されます。
wait()はsleep()とは違ってwait()が同期ロックを解除します。
wait()とnotify()は同期ロックに基づいて実現されるので、対象ごとに自分の同期ロックがあるので、wait()とnotify()はObjectの方法で、Threadではありません。
DEMO 2,wait()と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();
}
}
DEMO 2出力:db 1待ち
db 3待ち
db 2待ち
すべてを呼び覚ます
db 3帰ってきました
帰ってきました
db 2帰ってきました
同じオブジェクトのwait()方法は、複数の異なるスレッドで呼び出すことができ、異なるスレッドを待つ(ブロックする)ことができます。一つのnotify()もいいし、notifyAll()も呼び出されます。