Heim  >  Artikel  >  Java  >  Teilen Sie ein Beispiel-Tutorial zu den Grundlagen des Java-Multithreadings

Teilen Sie ein Beispiel-Tutorial zu den Grundlagen des Java-Multithreadings

零下一度
零下一度Original
2017-05-25 16:04:301980Durchsuche

Ich habe kürzlich Blumenkaffee gekauft, den ich mit der Kaffeemaschine geliefert habe, und die Blumen, die ich letzte Woche während meiner Reise nach Yangshuo gekauft habe.

Der Kaffeegeschmack ist etwas leichter und es duftet mehr nach Osmanthus.

Um es auf den Punkt zu bringen:

In diesem Artikel werden wir uns mit wait() notify() notifyAll() befassen.

DEMO1: wait() und 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-Ausgabe:

--ThreadTest 进入等待--
正在查询数据库 1
查询数据库 1 结束,: 无数据
--ThreadTest 结束等待--
根据结果继续做其他事情

Hinweis:

Verwenden Sie wait() und notify () muss nach Erhalt der Synchronisationssperre aufgerufen werden. Bei einem direkten Aufruf wird ein java.lang.IllegalMonitorStateException-Fehler gemeldet, da der state durch die Synchronisationssperre geschützt ist.

wait() unterscheidet sich von sleep() darin, dass wait() die Synchronisationssperre aufhebt.

Da wait() und notify() auf der Grundlage einer Synchronisationssperre implementiert werden, verfügt jedes Objekt über eine eigene Synchronisationssperre, sodass wait() und notify() Methoden von Object sind Faden.

DEMO2, wait() und 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-Ausgabe:

db1 等待
db3 等待
db2 等待
唤醒全部
db3 回来了
db1 回来了
db2 回来了

Die Methode wait() desselben Objekts kann mehrfach verwendet werden Mal in einem Thread aufgerufen, können verschiedene Threads nacheinander warten (blockieren), oder Sie können notifyAll() aufrufen, um sie alle gleichzeitig aufzuwecken.

[Verwandte Empfehlungen]

1. Detaillierte Erläuterung der Java-Multithreading-Grundlagen

2. Informationen zur Java-Thread-Synchronisierung

3. Detaillierte Erläuterung der Java-Thread-Synchronisierung und der Synchronisierungsmethoden

Das obige ist der detaillierte Inhalt vonTeilen Sie ein Beispiel-Tutorial zu den Grundlagen des Java-Multithreadings. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn