Javaマルチスレッド再学習
8669 ワード
プロセスORスレッド
プログラムが実行されると、彼はプロセスであり、1つのプロセスに複数のスレッドが含まれる可能性があります.私たちは一般的にネットワークをダウンロードし、バックグラウンドのタスクをスレッドに置いて行い、フロントエンドの操作に影響しません.
スレッドを実装するにはどうすればいいですか?
スレッド実装方法は2つある.Threadクラス2を継承する.Runableインタフェースを実現し、Threadに転送したり、誰かが書いたりした3つ目の、Runableの匿名の内部クラスを実現します.
スレッド間通信
ロックの問題で注意しなければならないのはsynchronizedのObjectが共通のリソースであることです.ロックの目的は、wait()、notify()、notifyAll()などの共通リソースに基づいてスレッド間で通信することである.
リファレンスコードセクション
Main
GetThread1
GetThread2
PutThread
最後に書く
スレッドの同期通信は、リソースロックの問題間の通信がマルチスレッドの鍵です.
プログラムが実行されると、彼はプロセスであり、1つのプロセスに複数のスレッドが含まれる可能性があります.私たちは一般的にネットワークをダウンロードし、バックグラウンドのタスクをスレッドに置いて行い、フロントエンドの操作に影響しません.
スレッドを実装するにはどうすればいいですか?
スレッド実装方法は2つある.Threadクラス2を継承する.Runableインタフェースを実現し、Threadに転送したり、誰かが書いたりした3つ目の、Runableの匿名の内部クラスを実現します.
スレッド間通信
ロックの問題で注意しなければならないのはsynchronizedのObjectが共通のリソースであることです.ロックの目的は、wait()、notify()、notifyAll()などの共通リソースに基づいてスレッド間で通信することである.
リファレンスコードセクション
Main
import java.util.ArrayList;
public class ThreadTest {
public static void main(String[] args) {
ArrayList arrayList=new ArrayList();
Object object=new Object();
PutThread putThread=new PutThread(arrayList,object);
GetThread getThread=new GetThread(arrayList,object);
GetThread2 getThread2=new GetThread2(arrayList,object);
Thread put=new Thread(putThread);
Thread get=new Thread(getThread);
Thread get2=new Thread(getThread2);
get.start();
get2.start();
put.start();
}
}
GetThread1
import java.util.ArrayList;
public class GetThread extends Thread {
ArrayList arrayList = null;
int max = 1;
Object object=null;
public GetThread(ArrayList arrayList,Object object) {
this.arrayList = arrayList;
this.object=object;
}
@Override
public void run() {
while (true) {
System.out.println("GET-----------1 "+arrayList.size());
synchronized (object) {
if (arrayList.size() < max) {
try {
object.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}else {
System.out.println("GET1 " + arrayList.remove(0) + " ");
System.out.println("GET-----------1 "+arrayList.size());
try {
sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
object.notify();
}
}
}
}
}
GetThread2
import java.util.ArrayList;
public class GetThread2 extends Thread {
ArrayList arrayList = null;
int max = 1;
Object object=null;
public GetThread2(ArrayList arrayList ,Object object) {
this.arrayList = arrayList;
this.object=object;
}
@Override
public void run() {
while (true) {
System.out.println("GET-----------2 "+arrayList.size());
synchronized (object) {
if (arrayList.size() < max) {
try {
object.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}else {
System.out.println("GET2 " + arrayList.remove(0) + " ");
System.out.println("GET-----------2 "+arrayList.size());
try {
sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
object.notify();
}
}
}
}
}
PutThread
import java.util.ArrayList;
public class PutThread extends Thread {
ArrayList arrayList = null;
Object object=null;
int max = 1;
int count = 1;
public PutThread(ArrayList arrayList,Object object) {
this.arrayList = arrayList;
this.object=object;
}
@Override
public void run() {
while (true) {
synchronized (object) {
if (arrayList.size() >=max) {
try {
object.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}else {
arrayList.add(count);
System.out.println(" " + count + " ");
count++;
try {
sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
object.notify();
}
}
}
}
}
最後に書く
スレッドの同期通信は、リソースロックの問題間の通信がマルチスレッドの鍵です.