ホームページ >Java >&#&チュートリアル >Java 並行プログラミング スレッドの作成方法:

Java 並行プログラミング スレッドの作成方法:

WBOY
WBOY転載
2023-05-09 13:01:071388ブラウズ

1. スレッドとプロセス

プロセスは、データ コレクション上のコードの実行アクティビティです。システム内のリソース割り当てとスケジューリングの基本単位です。スレッドはエンティティです。プロセス内の少なくとも 1 つのスレッド。CPU のスケジューリングと割り当ての基本単位です。プロセス内の複数のスレッドがプロセスのリソースを共有します。

プロセスの 3 つの特徴:

  • #ダイナミシティ: プロセスは実行中のプログラムであり、占有する必要があります。メモリ、CPU、ネットワークなどのリソースを動的に管理します。

  • 独立性: プロセスは互いに独立しており、独自の独立したメモリ領域を持っています。

  • 同時実行性: CPU がシングルコアの場合、メモリ内で同時に実行されるプロセスは実際には 1 つだけです。 CPU は時分割でポーリングと切り替えを行い、各プロセスを順番に処理します。切り替え速度が非常に速いため、これらのプロセスが同時に実行されているように感じられます。これが並行性です。

#2. スレッドの作成と実行

プロセス内でスレッドを作成するには 3 つの方法があります:

  • ##方法 1

    : Thread クラスを継承する方法

  • 1. Thread クラスを継承するスレッド クラスを定義します。
  • 2. run() メソッドをオーバーライドします
  • 3. 新しいスレッド オブジェクトを作成します。
  • 4. スレッド オブジェクトの start() メソッドを呼び出して、スレッドを開始します。
  • public class ThreadDemo {
        // 启动后的ThreadDemo当成一个进程。
        // main方法是由主线程执行的,理解成main方法就是一个主线程
        public static void main(String[] args) {
            // 3.创建一个线程对象
            Thread t = new MyThread();
            // 4.调用线程对象的start()方法启动线程,最终还是执行run()方法!
            t.start();
    
            for(int i = 0 ; i < 100 ; i++ ){
                System.out.println("main线程输出:"+i);
            }
        }
    }
    
    // 1.定义一个线程类继承Thread类。
    class MyThread extends Thread{
        // 2.重写run()方法
        @Override
        public void run() {
            // 线程的执行方法。
            for(int i = 0 ; i < 100 ; i++ ){
                System.out.println("子线程输出:"+i);
            }
        }
    }
利点:

コーディングは簡単です。Thread.currentThread() を使用せずに、これを直接使用して run() メソッドで現在のスレッドを取得するだけです。方法。欠点: thread クラスは Thread クラスを継承しているため、他のクラスを継承できず、継承による関数の拡張ができません (単一継承の制限)。また、タスクとコードが分離されていないため、複数のスレッドで同じタスクを実行する場合、複数のタスクコードが必要になります。

概要:

    スレッド クラスは、Thread を継承するクラスです。
  • スレッドを開始するには、start() メソッドを呼び出す必要があります。
  • 複数のスレッドが同時に CPU 実行をプリエンプトするため、実行プロセス中に同時実行のランダム性が発生します
方法 2:

方法Runnableインターフェイスを実装します。

    1. Runnable インターフェイスを実装するスレッド タスク クラスを作成します。
  • 2. run() メソッドをオーバーライドします
  • 3. スレッド タスク オブジェクトを作成します。
  • 4. スレッド タスク オブジェクトをスレッド オブジェクトにパックする
  • 5. スレッド オブジェクトの start() メソッドを呼び出して、糸。
  • public class ThreadDemo {
        public static void main(String[] args) {
            // 3.创建一个线程任务对象(注意:线程任务对象不是线程对象,只是执行线程的任务的)
            Runnable target = new MyRunnable();
            // 4.把线程任务对象包装成线程对象.且可以指定线程名称
            // Thread t = new Thread(target);
            Thread t = new Thread(target,"1号线程");
            // 5.调用线程对象的start()方法启动线程
            t.start();
    
            Thread t2 = new Thread(target);
            // 调用线程对象的start()方法启动线程
            t2.start();
    
            for(int i = 0 ; i < 10 ; i++ ){
                System.out.println(Thread.currentThread().getName()+"==>"+i);
            }
        }
    }
    
    // 1.创建一个线程任务类实现Runnable接口。
    class MyRunnable implements Runnable{
        // 2.重写run()方法
        @Override
        public void run() {
            for(int i = 0 ; i < 10 ; i++ ){
                System.out.println(Thread.currentThread().getName()+"==>"+i);
            }
        }
    }
利点:

スレッド タスク クラスは Runnable インターフェイスのみを実装し、引き続き他のクラスを継承し、他のクラスを実装し続けることができます。インターフェイス (単一継承の制限外を避ける)。同じスレッド タスク オブジェクトは、複数のスレッドが同じリソースを共有するのに適した複数のスレッド オブジェクトにパッケージ化できます。分離操作を実現するために、スレッド タスク コードを複数のスレッドで共有でき、スレッド タスク コードとスレッドは独立しています。

方法 3:

Callable インターフェイスの実装

    1. Callable インターフェイスを実装するスレッド タスク クラスを定義し、スレッドの結果の型を宣言します。実行。
  • 2. スレッドタスククラスのcallメソッドを書き換え、実行結果を直接返すことができるようにします。
  • 3. 呼び出し可能なスレッド タスク オブジェクトを作成します。
  • 4. Callable スレッド タスク オブジェクトを FutureTask オブジェクトにパックします。
  • 5. FutureTask オブジェクトをスレッド オブジェクトにパックします。
  • 6. スレッドの start() メソッドを呼び出してスレッドを開始します。
  • public class ThreadDemo {
        public static void main(String[] args) {
            // 3.创建一个Callable的线程任务对象
            Callable call = new MyCallable();
            // 4.把Callable任务对象包装成一个未来任务对象
            //      -- public FutureTask(Callable<V> callable)
            // 未来任务对象是啥,有啥用?
            //      -- 未来任务对象其实就是一个Runnable对象:这样就可以被包装成线程对象!
            //      -- 未来任务对象可以在线程执行完毕之后去得到线程执行的结果。
            FutureTask<String> task = new FutureTask<>(call);
            // 5.把未来任务对象包装成线程对象
            Thread t = new Thread(task);
            // 6.启动线程对象
            t.start();
    
            for(int i = 1 ; i <= 10 ; i++ ){
                System.out.println(Thread.currentThread().getName()+" => " + i);
            }
    
            // 在最后去获取线程执行的结果,如果线程没有结果,让出CPU等线程执行完再来取结果
            try {
                String rs = task.get(); // 获取call方法返回的结果(正常/异常结果)
                System.out.println(rs);
            }  catch (Exception e) {
                e.printStackTrace();
            }
    
        }
    }
    
    // 1.创建一个线程任务类实现Callable接口,申明线程返回的结果类型
    class MyCallable implements Callable<String>{
        // 2.重写线程任务类的call方法!
        @Override
        public String call() throws Exception {
            // 需求:计算1-10的和返回
            int sum = 0 ;
            for(int i = 1 ; i <= 10 ; i++ ){
                System.out.println(Thread.currentThread().getName()+" => " + i);
                sum+=i;
            }
            return Thread.currentThread().getName()+"执行的结果是:"+sum;
        }
    }
利点:

スレッド タスク クラスは Callable インターフェイスのみを実装し、引き続き他のクラスを継承し、他のインターフェイスを実装し続けることができます (次の制限を回避します)。単一継承)。同じスレッド タスク オブジェクトは、複数のスレッドが同じリソースを共有するのに適した複数のスレッド オブジェクトにパッケージ化できます。分離操作を実現するには、スレッド タスク コードを複数のスレッドで共有し、スレッド タスク コードとスレッドを独立させることができます。最も重要なことは、スレッドの実行結果を直接取得できることです。

以上がJava 並行プログラミング スレッドの作成方法:の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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