ホームページ  >  記事  >  Java  >  Java でのマルチスレッドの基本的な方法の使用方法の紹介 (例付き)

Java でのマルチスレッドの基本的な方法の使用方法の紹介 (例付き)

不言
不言転載
2018-10-08 15:12:342547ブラウズ

この記事では、Java でのマルチスレッドの基本的なメソッドの使用方法を紹介します (例を示します)。必要な方は参考にしていただければ幸いです。ヘルプ。

Thread sleep sleep()

Thread.sleep(ミリ秒); sleep メソッドを使用して、スレッドをスリープ状態に設定できます。 sleep が静的メソッドであることがわかります。

public static native void sleep(long var0) throws InterruptedException;
    try {
        System.out.println(new Date().getSeconds());
        Thread.sleep(5000);
        System.out.println(new Date().getSeconds());
    } catch (InterruptedException e) {
        e.printStackTrace();
    }

setDaemon daemon thread

デーモン以外のスレッドが停止し、デーモン スレッドが自動的に終了します

    public static void main(String[] args) {
        Thread thread1 = new Thread() {
            @Override
            public void run() {
                super.run();
                for(int i = 0; i < 5; i ++) {
                    System.out.println("非守护线程");
                }
            }
        };

        Thread thread2 = new Thread() {
            @Override
            public void run() {
                for(int i = 0; i < 200; i ++) {
                    System.out.println("守护线程");
                }
            }
        };

        thread2.setDaemon(true);
        thread1.start();
        thread2.start();
    }

thread2 であることは明らかです。を 200 回出力する必要がありますが、ここでは数行しか出力されません。これは、thread1 が実行を完了すると、thread2 がデーモン スレッドとして自動的に停止するためです。
Java でのマルチスレッドの基本的な方法の使用方法の紹介 (例付き)

マルチスレッド jion

jion メソッドが実行される場合、現在のスレッドを停止し、最初に jion() を実行したスレッドを実行します。これはキュージャンプ実行と同等です。以下のように、thread2 スレッドを実行するとき、i==20 の場合、thread1 がキューにジャンプして最初に実行されます。

    public static void main(String[] args) {
        final Thread thread1 = new Thread() {
            @Override
            public void run() {
            super.run();
            for(int i = 0; i < 500; i ++) {
                System.out.println("thread1---" + i);
            }
            }
        };

        Thread thread2 = new Thread() {
            @Override
            public void run() {
                for(int i = 0; i < 200; i ++) {
                    if (i == 20) {
                        try {
                            //插队执行
                            thread1.join();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                    System.out.println(i);
                }
            }
        };
        thread1.start();
        thread2.start();
    }

join() メソッドは、パラメーター long ミリ秒 join (ミリ秒)
を渡すこともできます。 ##setPriority はスレッドの優先順位を設定します。

デフォルトの優先順位は 5、最小値 1、最大値 10

優先順位が高くなるほど、優先順位が高くなります。

   public static void main(String[] args) {
        final Thread thread1 = new Thread() {
            @Override
            public void run() {
            super.run();
            for(int i = 0; i < 500; i ++) {
                System.out.println("thread1---" + i);
            }
            }
        };

        Thread thread2 = new Thread() {
            @Override
            public void run() {
                for(int i = 0; i < 200; i ++) {
                    if (i == 20) {
                        try {
                            //插队执行1毫秒
                            thread1.join(1);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                    System.out.println(i);
                }
            }
        };
        thread1.start();
        thread2.start();
    }

synchronized

同期されたコード ブロック

複数のスレッドが同時に実行され、複数のコードが同時に実行される場合。コードの実行時に CPU がスレッドを切り替えないことを願っています

同期なしの状況

同期なしで何が起こるかを見てみましょう

    public static void main(String[] args) {
        final Thread thread1 = new Thread() {
            @Override
            public void run() {
            super.run();
            for(int i = 0; i < 500; i ++) {
                System.out.println( getName() + "---" + i);
            }
            }
        };

        Thread thread2 = new Thread() {
            @Override
            public void run() {
                for(int i = 0; i < 200; i ++) {
                    if (i % 5 == 0) {
                        Thread.yield();
                    }
                    System.out.println(getName() + "---" + i);
                }
            }
        };
        thread1.start();
        thread2.start();
    }

スレッド thread1 の実行中に、一部の出力が完全に出力されなかったことが判明しました。CPU はスレッド 2 によってプリエンプトされました。この場合、それは明らかに当社のビジネス ロジックと一致しません。したがって、スレッドが完全なメソッドを実行した後にのみ、CPU が他のスレッドによってプリエンプトされるようにする必要があります。

Use synchronized

    public static void main(String[] args) {
        final Thread thread1 = new Thread() {
            @Override
            public void run() {
            super.run();
            for(int i = 0; i < 500; i ++) {
                System.out.println( getName() + "---" + i);
            }
            }
        };

        Thread thread2 = new Thread() {
            @Override
            public void run() {
                for(int i = 0; i < 500; i ++) {

                    System.out.println(getName() + "---" + i);
                }
            }
        };
        //设置最大的线程优先级最大为10
        thread1.setPriority(Thread.MIN_PRIORITY);
        //设置最小的线程优先级,最小为1
        thread2.setPriority(Thread.MAX_PRIORITY);
        thread1.start();
        thread2.start();
    }
Java でのマルチスレッドの基本的な方法の使用方法の紹介 (例付き)

synchronized 同期を使用した後コード ブロックを参照すると、上記の状況は発生しないことがわかります。

同期メソッド

public class ThreadSynchronied {

    public static void main(String[] args) {
        final Say say = new Say();

         Thread thread1 = new Thread() {
            @Override
            public void run() {
                for (int i = 0 ; i < 10000 ; i ++) {
                    say.say();
                }
            }
        };

        Thread thread2 = new Thread() {
            @Override
            public void run() {
                for (int i = 0 ; i < 10000 ; i ++) {
                    say.say1();
                }
            }
        };
        //设置最大的线程优先级最大为10
        thread1.setPriority(Thread.MIN_PRIORITY);
        //设置最小的线程优先级,最小为1
        thread2.setPriority(Thread.MAX_PRIORITY);
        thread1.start();
        thread2.start();
    }
}

class Say {
    void say() {
        System.out.print("s ");
        System.out.print("a ");
        System.out.print("y ");
        System.out.print("h ");
        System.out.print("e ");
        System.out.print("l ");
        System.out.print("l ");
        System.out.println("o");
    }

    void say1() {
        System.out.print("1 ");
        System.out.print("2 ");
        System.out.print("3 ");
        System.out.print("4 ");
        System.out.print("5 ");
        System.out.print("6 ");
        System.out.print("7 ");
        System.out.println("8");
    }
}
Java でのマルチスレッドの基本的な方法の使用方法の紹介 (例付き)同期メソッドはメソッドのロックを指します

静的同期メソッドのオブジェクトは次のとおりです。このクラスのバイトコード オブジェクト

非静的同期メソッドのロック オブジェクトはこれです

複数のスレッドが同じリソース ロックを使用するため、デッドロックが発生しやすくなります

デッドロックとは何ですか?


デッドロックとは、実行中に 2 つ以上のプロセスがリソースを競合したり、相互に通信したりすることによって発生するブロック現象を指します。外部の力がなければ、プロセスは先に進むことができません。このとき、システムがデッドロック状態にある、またはシステムがデッドロックを起こしているといいます。このような常に相互に待機しているプロセスをデッドロック プロセスといいます。

スレッドセーフ クラス

Vector

StringBuffer
HashTable

スレッドアンセーフ

ArrayList
StringBuilder
HashSet

java.util.Collections には synchronizedList とその他のメソッドがあり、スレッド安全でないコレクションをスレッド安全なコレクションに変換するのをサポートします


以上がJava でのマルチスレッドの基本的な方法の使用方法の紹介 (例付き)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はcnblogs.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。