Javaマルチスレッド再学習

8669 ワード

プロセスORスレッド
プログラムが実行されると、彼はプロセスであり、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();
                }
            }
        }
    }
}

最後に書く
スレッドの同期通信は、リソースロックの問題間の通信がマルチスレッドの鍵です.