javaマルチスレッド-1
スレッドの作成方法
1.スレッドオブジェクト
1.1Threadオブジェクトを継承する
@Slf4j
public class MyThread extends Thread{
@Override
public void run() {
// 线程要执行的内容
log.debug("继承Thread方式");
}
}
public class Test1 {
public static void main(String[] args) {
new MyThread().start(); // 启动线程
}
}
1.2Threadオブジェクトを直接使用する
public class Test1 {
public static void main(String[] args) {
Thread t = new Thread(){
@Override
public void run() {
log.debug("线程执行");
}
};
t.start();
}
}
2.実行可能なインターフェース
public class MyThread implements Runnable{
@Override
public void run() {
// 该线程执行内容
System.out.println("线程执行");
}
}
public static void main(String[] args) {
MyThread myThread = new MyThread();
Thread t1 = new Thread(myThread, "t1");
t1.start();
// jdk8 Lambda
Thread t2 = new Thread(()->{
System.out.println("t2执行");}, "t1");
t2.start();
Runnable runnable = ()->{
System.out.println("t3执行"); };
Thread t3 = new Thread(runnable, "t3");
t3.start();
}
3.ランナブルとスレッドの関係
実行可能ファイルを実行するには、スレッドに渡す必要があります
Runnable runnable = ()->{
System.out.println("t3执行"); };
Thread t3 = new Thread(runnable, "t3");
t3.start();
スレッドのソースコードをクリックして、Runnableがinitメソッドに渡されることを確認します
initが別のinitに渡されていることがわかり
ます。initメソッドがそれ自体の変数を渡していることがわかります。
Threadクラスのrun()メソッドが最終的にこのRunnableのrunメソッドを呼び出すことがわかりました。
Runnableの実行は、最終的にはThreadの実行です。Threadのrunメソッドが再実行されない場合、Threadのrunメソッドは、最初にRunnableが渡されているかどうかを判別し、渡されている場合は、Runnableのrunメソッドを実行します。
3.Callable和FutureTask
FutureTask自体がRunnableFutureを実装します
public class FutureTask<V> implements RunnableFuture<V>
RunnableFutureはRunnableとFutureを継承します
public interface RunnableFuture<V> extends Runnable, Future<V>
つまり、FutureTaskもRunnableと見なすことができますが
、Futureのメソッドを継承するため、Runnableよりも強力です。これにより、スレッドの実行結果を取得できます
。Callableは単なるインターフェイスです。その呼び出しメソッドとRunnable実行メソッドは本質的に類似しており、すべてスレッドです。その中でコードを実行しますが、呼び出しには一般的な戻り値があり、例外をスローすることもあります。runメソッドには例外がなく、内部でダイジェストする必要があります。
ただし、コードを実行するときは、startメソッドを使用し、runメソッドを実行しますが、runメソッドではなくcallメソッドを書き直したことがわかりました。
FutureTaskクラスをクリックして、内部のrunメソッドをオーバーライドしていることを確認します。開始時にスレッドを開始すると、runメソッドは着信Callableのcallメソッドを呼び出し、ここで例外を処理します。 getおよびその他のメソッドを呼び出すために、値がFutureTaskのsetメソッドに返されます。
値は変数の結果に返されます
getメソッドが呼び出されると、reportメソッド
が呼び出されます。メソッドの戻り値は、呼び出しを呼び出すrunメソッドの値です。
getメソッドには戻り値があることに注意してください。これは、スレッドが非同期に戻るまでブロックすることを意味します。