ホームページ >Java >&#&チュートリアル >Java でスレッドを作成して実行するにはどうすればよいですか?
この方法は最も基本的なものです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 インターフェイスを継承し、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 インターフェイスを実装することです。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 インターフェイス メソッドの呼び出しメソッド
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
Callable インターフェイス呼び出しメソッドの戻り値は、ジェネリックによって定義できます。
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 サイトの他の関連記事を参照してください。