合併を実現するいくつかの方法について簡単に述べる.
4770 ワード
JAvaの同時実現の7つの方式Javaマルチスレッドの実現方式は大体7つの実現方式がある:Threadクラスを継承し、Runnableインターフェースを実現し、Callableインターフェースを実現し、スレッドプールを使用し、Timerタイマーを使用し、内部クラス実現、jdk 1.8のstream
1.継承ThreadクラスThreadクラスは本質的にRunnableインタフェースを実装したインスタンスであり、スレッドのインスタンスを表す.起動方法は、Threadクラスのstart()インスタンスを継承する方法です.run()メソッド(書き換え)を実行します.新しいスレッドを起動し、独自の定義を実行できます.たとえば、次のようになります.
//実装方法のクラスpublic class Demo 1 extends Thread{
}
//実行方法public static void main(String[]args){
}
実行結果:Threadクラスを継承
2.Runnableインタフェースの実装javaは単一継承であるため,通常開発ではインタフェースを用いた実装が提唱されている.Runnableインタフェースを実装するrunメソッドを介してマルチスレッドクラスを実装する必要がある.Threadのstart()メソッドで起動します.たとえば、次のようにします.
//実装方法クラス:public class Demo 2 implements Runnable{
//実行方法:public static void main(String[]args){
}
実行結果:runnableインタフェースの実装
3.内部クラスによってマルチスレッドを実現することは、Threadクラスのstart()メソッドによって直接実現することができる.なぜなら、ThreadクラスはRunnableインタフェースを実現し、runメソッドを書き直し、runメソッドで独自の論理を実現するからである.例えば、
//ここではCountDownLatchを介してブロックを行い、2つのスレッドの起動を観察し、public static CountDownLatch countDownLatch=new CountDownLatch(2);
}
4.Callableインタフェースを実装Callableインタフェースを実装するcallメソッドにより、FutureTaskのget()メソッドによりcallメソッドの戻り値を取得することができ、具体的には以下のように実現する.
//実装クラスメソッド:public class Demo 3 implements Callable{
}
//実行方法:public static void main(String[]args){
}
実行結果:
5.スレッドプールによるマルチスレッドスレッドプールの実装は、異なるシーンに基づいて異なるスレッドプールを選択して実装できます.ここでは、そのうちの1つだけを使用して説明します.その後、スレッドプールに関する個別の説明を個別に書きます.
//実装コードは以下の通り:public class Demo 5{
}
実行結果:
6.Timerタイマによるマルチスレッドの実現はTimerにとってスケジューラであり、TimerTaskはrunメソッドを実現するクラスにすぎないが、具体的なTimerTaskはあなた自身で実現する必要があり、パラメータによって異なる実行方法が存在する.例えば、遅延タイミングタスクのように:
//具体コードは以下の通り:public class Demo 6{
}
実行結果:
7.jdk1.8 streamによりマルチスレッドjdk 1を実現する.8 APIは、ストリームStreamという新しい抽象を追加し、データを宣言的に処理することができます.Streamは、SQL文を使用してデータベースからデータをクエリーするような直感的な方法を使用して、Javaコレクションの演算と表現の高次抽象化を提供します.具体的な単純コードは以下のように実現される.
//コード実装:public class Demo 7{
}
実行結果:実行開始、すべての要求が印刷に入りました.スレッド実行はここまで、スレッド実行はここまで、スレッド実行はここまで、スレッド実行はここまで、スレッド実行はここまで、スレッド実行はここまで、スレッド実行は10 s待ってから、同時に結果を印刷します.無秩序な印刷結果は以下の通りです.
1.継承ThreadクラスThreadクラスは本質的にRunnableインタフェースを実装したインスタンスであり、スレッドのインスタンスを表す.起動方法は、Threadクラスのstart()インスタンスを継承する方法です.run()メソッド(書き換え)を実行します.新しいスレッドを起動し、独自の定義を実行できます.たとえば、次のようになります.
//実装方法のクラスpublic class Demo 1 extends Thread{
public void run(){
System.out.println(" Thread ");
}
}
//実行方法public static void main(String[]args){
Demo1 demo1=new Demo1();
demo1.start();
}
実行結果:Threadクラスを継承
2.Runnableインタフェースの実装javaは単一継承であるため,通常開発ではインタフェースを用いた実装が提唱されている.Runnableインタフェースを実装するrunメソッドを介してマルチスレッドクラスを実装する必要がある.Threadのstart()メソッドで起動します.たとえば、次のようにします.
//実装方法クラス:public class Demo 2 implements Runnable{
@Override
public void run() {
System.out.println(" runnable ");
}
//実行方法:public static void main(String[]args){
Demo2 demo2=new Demo2();
Thread thread=new Thread(demo2);
thread.start();
}
実行結果:runnableインタフェースの実装
3.内部クラスによってマルチスレッドを実現することは、Threadクラスのstart()メソッドによって直接実現することができる.なぜなら、ThreadクラスはRunnableインタフェースを実現し、runメソッドを書き直し、runメソッドで独自の論理を実現するからである.例えば、
//ここではCountDownLatchを介してブロックを行い、2つのスレッドの起動を観察し、public static CountDownLatch countDownLatch=new CountDownLatch(2);
public static void main(String[] args) {
new Thread(()->{
countDownLatch.countDown();
try {
countDownLatch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("T1");
}).start();
new Thread(()->{
countDownLatch.countDown();
try {
countDownLatch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("T2");
}).start();
}
:
:
T2
T1
:
T1
T2
4.Callableインタフェースを実装Callableインタフェースを実装するcallメソッドにより、FutureTaskのget()メソッドによりcallメソッドの戻り値を取得することができ、具体的には以下のように実現する.
//実装クラスメソッド:public class Demo 3 implements Callable{
@Override
public Object call() {
return "1";
}
}
//実行方法:public static void main(String[]args){
//
Callable demo3=new Demo3();
FutureTask oneTask = new FutureTask(demo3);
Thread thread=new Thread(oneTask);
thread.start();
Object o = null;
try {
//
o = oneTask.get();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
System.out.println(o);
}
実行結果:
5.スレッドプールによるマルチスレッドスレッドプールの実装は、異なるシーンに基づいて異なるスレッドプールを選択して実装できます.ここでは、そのうちの1つだけを使用して説明します.その後、スレッドプールに関する個別の説明を個別に書きます.
//実装コードは以下の通り:public class Demo 5{
public static void main(String[] args) {
ExecutorService executorService = Executors.newFixedThreadPool(5);
for(int i=0;i<5;i++){
int finalI = i;
executorService.execute(()-> {
System.out.println(finalI);
});
}
}
}
実行結果:
6.Timerタイマによるマルチスレッドの実現はTimerにとってスケジューラであり、TimerTaskはrunメソッドを実現するクラスにすぎないが、具体的なTimerTaskはあなた自身で実現する必要があり、パラメータによって異なる実行方法が存在する.例えば、遅延タイミングタスクのように:
//具体コードは以下の通り:public class Demo 6{
public static void main(String[] args) {
Timer timer=new Timer();
timer.schedule(new TimerTask(){
@Override
public void run() {
System.out.println(1);
}
},2000l,1000l);
}
}
実行結果:
7.jdk1.8 streamによりマルチスレッドjdk 1を実現する.8 APIは、ストリームStreamという新しい抽象を追加し、データを宣言的に処理することができます.Streamは、SQL文を使用してデータベースからデータをクエリーするような直感的な方法を使用して、Javaコレクションの演算と表現の高次抽象化を提供します.具体的な単純コードは以下のように実現される.
//コード実装:public class Demo 7{
// , countDownLatch
static CountDownLatch countDownLatch=new CountDownLatch(6);
public static void main(String[] args) {
List list=new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
list.add(5);
list.add(6);
list.parallelStream().forEach(p->{
// ,
countDownLatch.countDown();
try {
System.out.println(" ");
Thread.sleep(10000);
countDownLatch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(p);
});
}
}
実行結果:実行開始、すべての要求が印刷に入りました.スレッド実行はここまで、スレッド実行はここまで、スレッド実行はここまで、スレッド実行はここまで、スレッド実行はここまで、スレッド実行はここまで、スレッド実行は10 s待ってから、同時に結果を印刷します.無秩序な印刷結果は以下の通りです.