ホームページ >Java >&#&チュートリアル >Java でスレッドを作成して実行するにはどうすればよいですか?

Java でスレッドを作成して実行するにはどうすればよいですか?

王林
王林転載
2023-04-19 14:16:051654ブラウズ

    1. スレッドを作成して実行する 5 つの方法

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

    この方法は最も基本的なものですJavaを勉強したことのある友人は皆この方法を知っているので、詳しくは説明しません。次の点に注意してください: オーバーライド実装は run メソッドを使用し、実行中のスレッドは start メソッドを使用します。

    public class FirstWay extends Thread  {
        @Override
        public void run() {
            System.out.println("第一种实现线程的方式:继承Thread类");
        }
        //模拟测试
        public static void main(String[] args) {
            new FirstWay().start();
        }
    }

    2 番目: Runnable インターフェイスの実装

    2 番目の実装方法はまだ非常に基本的なもので、Runnable インターフェイスを継承し、run メソッドを書き換えてスレッド実行ロジックを実装します。注: 実行中のスレッドには、new Thread のレイヤーが必要です。

    public class SecondWay implements Runnable{
        @Override
        public void run() {
            System.out.println("第二种实现线程的方式:实现Runnable接口");
        }
        //模拟测试
        public static void main(String[] args) {
            new Thread(new SecondWay()).start();
        }
    }

    3 番目の方法: Callable インターフェイスを実装する

    3 番目の方法は、Callable インターフェイスを実装することです。Callable インターフェイスと Runable インターフェイスの両方でスレッドを実装できます。

    public class ThirdWay implements Callable<String> {
        @Override
        public String call() throws Exception {
            System.out.println("第三种实现线程的方式:实现Callable接口");
            return "Callable接口带返回值,可以抛出异常";
        }
    
        //模拟测试
        public static void main(String[] args) throws ExecutionException, InterruptedException {
            FutureTask<String> futureTask = new FutureTask<>(new ThirdWay());
            new Thread(futureTask).start();
            //阻塞方法,获取call方法返回值
            System.out.println(futureTask.get());  //打印:Callable接口带返回值,可以抛出异常
        }
    }

    違いは次のとおりです。

    • #Callable インターフェイスによって実装されるスレッド メソッドは call であり、スレッド メソッドは callable インターフェイスによって実装されます。 Runable インターフェイスが実行されます

    • Callable には戻り値がありますが、Runable インターフェイスには戻り値はありません

    • Callable インターフェイスのメソッド呼び出しの戻り値を設定できますジェネリック型に変換する場合、次の例では String データ型が使用されます

    • Callable インターフェイス メソッドの call メソッドは例外をスローできますが、Runable インターフェイスの run メソッドは例外をスローできません

    • new Thread(futureTask ).start()Run を介して呼び出し可能なインターフェイス メソッドを実行すると、FutureTask の get メソッドで、Callable インターフェイス メソッドの呼び出しメソッド

    • # の戻り値を取得できます。
    • ##Callable インターフェースのメソッド呼び出しメソッドが異常な場合は、FutureTask の get メソッドを呼び出します。

    • ##4 番目: スレッド プールの実行
    ## の場合も同じ例外がスローされます。 #JDK5 バージョン以降、Java はデフォルトでスレッド プール サポートを提供します。スレッド プールを使用するこの方法でスレッドを実行すると、スレッドの無限の拡張によって引き起こされるアプリケーションのダウンタイムを回避でき、頻繁なスレッドの作成と破棄によるリソースと時間のコストも節約できます。

    public class FourthWay implements Runnable{
        @Override
        public void run() {
            System.out.println(Thread.currentThread().getName() +
                    ":实现线程的方式Runnable接口,但运行方式不一样,使用线程池");
        }
    
        public static void main(String[] args) {
            //创建一个固定大小的线程池
            ExecutorService threadPool = Executors.newFixedThreadPool(5);
            for(int i = 0;i < 10;i++){
                threadPool.execute(new FourthWay());
            }
        }
    }

    スレッド プール ExecutorService は、execute メソッドを使用して、Runnable インターフェイスの run メソッドのスレッド実装を実行します。execute メソッドと run メソッドの共通の特徴は、戻り値がないことです。 。

    pool-1-thread-5:实现线程的方式Runnable接口,但运行方式不一样,使用线程池
    pool-1-thread-2:实现线程的方式Runnable接口,但运行方式不一样,使用线程池
    pool-1-thread-4:实现线程的方式Runnable接口,但运行方式不一样,使用线程池
    pool-1-thread-4:实现线程的方式Runnable接口,但运行方式不一样,使用线程池
    pool-1-thread-4:实现线程的方式Runnable接口,但运行方式不一样,使用线程池
    pool-1-thread-1:实现线程的方式Runnable接口,但运行方式不一样,使用线程池
    pool-1-thread-4:实现线程的方式Runnable接口,但运行方式不一样,使用线程池
    pool-1-thread-3:实现线程的方式Runnable接口,但运行方式不一样,使用线程池
    pool-1-thread-2:实现线程的方式Runnable接口,但运行方式不一样,使用线程池
    pool-1-thread-5:实现线程的方式Runnable接口,但运行方式不一样,使用线程池
    上記の結果からわかるように、スレッド プールには 5 つのスレッドが含まれています。スレッドは完了後、破棄されずにスレッド プールに戻され、スレッド リソースはスレッド プールから取得され、次回の実行時に再度実行されます。

    5 番目のタイプ: スレッド プールの submit

    次の例のスレッド プール ExecutorService は、submit メソッドを使用して、Callable インターフェイスの call メソッドのスレッド実装を実行します。 submitメソッドとcallメソッドには戻り値があります。

    Callable インターフェイス呼び出しメソッドの戻り値は、ジェネリックによって定義できます。
    • ExecutorService スレッド プールの送信の戻り値メソッドは Future
    • Future の get メソッドは call メソッドの戻り値を取得できますが、同時に
    • call メソッドが例外をスローした場合、 Future も例外をスローします。

    public class FifthWay implements Callable<String> {
        @Override
        public String call() throws Exception {
            return Thread.currentThread().getName() + ":Callable接口带返回值,可以抛出异常";
        }
    
        //模拟测试
        public static void main(String[] args) throws ExecutionException, InterruptedException {
            //保存多线程执行结果
            List<String> retList = new ArrayList<>();
            //创建一个固定大小的线程池
            ExecutorService threadPool = Executors.newFixedThreadPool(5);
            for(int i = 0;i < 10;i++){
                Future<String> future = threadPool.submit(new FifthWay());
                retList.add(future.get());
            }
            //java8 语法,打印retlist
            retList.forEach(System.out::println);
        }
    }
    上記のコードには小さな構文糖があります。retList.forEach(System.out::println);

    は、java8

    pool-1-thread-1:Callable接口带返回值,可以抛出异常
    pool-1-thread-2:Callable接口带返回值,可以抛出异常
    pool-1-thread-3:Callable接口带返回值,可以抛出异常
    pool-1-thread-4:Callable接口带返回值,可以抛出异常
    pool-1-thread-5:Callable接口带返回值,可以抛出异常
    pool-1-thread-1:Callable接口带返回值,可以抛出异常
    pool-1-thread-2:Callable接口带返回值,可以抛出异常
    pool-1-thread-3:Callable接口带返回值,可以抛出异常
    pool-1-thread-4:Callable接口带返回值,可以抛出异常
    pool-1-thread-5:Callable接口带返回值,可以抛出异常
    によって提供されるメソッド参照です。

    以上がJava でスレッドを作成して実行するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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