Aliインタビュアー:Javaマルチスレッドの言い方すら知らないのですが、どうして私に来てくれるようお願いするのですか?

スレッドを作成する方法

  • Threadクラスを継承する

  • Threadクラスを継承し、runメソッドを書き換えて、スレッドクラスのinstance.start()メソッドを介してスレッドを開始します。

public class TestThread1 extends Thread{
    @override
    public void run(){
        System.out.println("线程run方法!");
    }
    
    public static void main(String){
        new TestThread1().start();
    }
}

  • Runnableインターフェースを実装する

  • Runnableインターフェースを実装し、runメソッドを書き直して、**新しいスレッド(スレッドクラスインスタンス)からスレッドを開始します。start()**

  • このメソッドは、Javaの単一継承の制限を回避するために推奨されます

public class TestThread2 implements Runnable{
	@Override
	public void run() {
		System.out.println("线程run方法!");
	}
	
	public static void main(String[] args) {
		new Thread(new TestThread2()).start();
	}
}


  • Callableインターフェースを実装する

  • Callableインターフェースを実装し、callメソッドを書き換え、callメソッドには戻り値があります

  • 開始方法:

  • 実行サービスを作成する

  • 実行のために提出

  • 結果を得る

  • サービスを閉じる

public class TestThread2 implements Callable{
	@Override
	public Boolean call() {
		System.out.println("线程call方法!");
		return true;
	}
	
	public static void main(String[] args) throws InterruptedException, ExecutionException {
		
		TestThread2 t1 = new TestThread2();
		TestThread2 t2 = new TestThread2();
		TestThread2 t3 = new TestThread2();
		//创建执行服务
		ExecutorService ser = Executors.newFixedThreadPool(3);
		//提交执行
		Future<Boolean> r1 = ser.submit(t1);
		Future<Boolean> r2 = ser.submit(t2);
		Future<Boolean> r3 = ser.submit(t3);
		//获取结果
		boolean rs1 = r1.get();
		boolean rs2 = r2.get();
		boolean rs3 = r3.get();
		//关闭服务
		ser.shutdownNow();
	}

スレッド同期

  • 複数のスレッドが同時に同じリソースを操作し、スレッドは安全ではなく、変数値は無秩序です

  • ロック

  • キュー+ロック(同期)

  • 同期されたデフォルトロックこれは、指定したロックオブジェクトを表示して変更できます。

1.同期修正メソッド、スレッドセーフメソッド

public class TestThreadSafe {

    public static void main(String[] args) {
        BuyTicket bt1 = new BuyTicket();

        Thread thread1 = new Thread(bt1,"张三");
        Thread thread2 = new Thread(bt1,"李四");
        Thread thread3 = new Thread(bt1,"黄牛");

        thread1.start();
        thread2.start();
        thread3.start();
    }

}

class BuyTicket implements Runnable{

    private int ticketNumber = 10;

    private boolean flag = true;

    @Override
    public void run() {
        while(flag) {
            try {
                buy();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    public synchronized void buy() throws InterruptedException {
        //买票
        if(ticketNumber <= 0){
            System.out.println("票卖完了!");
            flag = false;
            return;
        }
        Thread.sleep(100);
        //Thread.yield();
        System.out.println(Thread.currentThread().getName() + "买到了一张票,还剩下"+(--ticketNumber) + "张票!");
    }
}

2.変更された同期コードブロック、スレッドセーフコードブロック

public class TestThreadSafe {

    public static void main(String[] args) {
        BuyTicket bt1 = new BuyTicket();

        Thread thread1 = new Thread(bt1,"张三");
        Thread thread2 = new Thread(bt1,"李四");
        Thread thread3 = new Thread(bt1,"黄牛");

        thread1.start();
        thread2.start();
        thread3.start();
    }

}

class BuyTicket implements Runnable{

    private int ticketNumber = 10;

    private boolean flag = true;

    @Override
    public void run() {
        while(flag) {
            System.out.println(Thread.currentThread().getName() + "准备买票" + flag);
            try {
                buy();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    public void buy() throws InterruptedException {
        synchronized(this){
            //买票
            if(ticketNumber <= 0){
                flag = false;
                System.out.println("票卖完了!");
                return;
            }
            Thread.sleep(100);
            //Thread.yield();
            System.out.println(Thread.currentThread().getName() + "买到了一张票,还剩下"+(--ticketNumber) + "张票!");
        }
    }
}

3. ReentrantLockを使用する

import java.util.concurrent.locks.ReentrantLock;

public class TestLock {

    public static void main(String[] args) {
        BuyTicket bt1 = new BuyTicket();

        Thread thread1 = new Thread(bt1,"张三");
        Thread thread2 = new Thread(bt1,"李四");
        Thread thread3 = new Thread(bt1,"黄牛");

        thread1.start();
        thread2.start();
        thread3.start();
    }

}

class BuyTicket implements Runnable{

    private int ticketNumber = 1000;

    private boolean flag = true;

  //定义可重复锁
    private	final ReentrantLock lock = new ReentrantLock();
    
    @Override
    public void run() {
        while(flag) {
            try {
                buy();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    public void buy() throws InterruptedException {
        	lock.lock();
            //买票
            if(ticketNumber <= 0){
                System.out.println("票卖完了!");
                flag = false;
            }else {
            	Thread.sleep(100);
                //Thread.yield();
                System.out.println(Thread.currentThread().getName() + "买到了一张票,还剩下"+(--ticketNumber) + "张票!");
            }
            lock.unlock();
    }
}


  • デッドロック

  • 3つ以上のオブジェクトロックの場合、各スレッドは互いに必要なリソースを占有します。デッドロックを形成します。

スレッドの状態

  • 新入生のステータス(新規)
  • 準備完了状態(開始)
  • ブロッキング状態(スリープ、待機、同期ロック)
  • 稼働状況
  • デッドステートのスレッドオブジェクトがデッドステートに入ると、start()メソッドを再度呼び出して再開することはできません

Thread(Threadクラス)メソッド

  • setPriority(int newPriority)スレッドの優先度newPriorityを1から10に変更します。

  • static void sleep(long millis)は、スレッドロックオブジェクトを解放せずに、現在実行中のスレッドを指定されたミリ秒の間スリープさせます。

  • void join()スレッドをマージし、スレッドが終了するのを待ちます

  • static void yield()現在実行中のスレッドを一時停止し、他のスレッドを実行します

  • void interrupt()割り込みスレッド

  • boolean isAlive()は生きているスレッドです

デーモンスレッド

  • setDaemon(true):デーモンスレッドとして設定

  • スレッドはユーザースレッドとデーモンスレッドに分けられます

  • JVM仮想マシンは、ユーザースレッドが確実に実行されるようにします

  • JVM仮想マシンは、デーモンスレッドの実行が完了するのを待つ必要はありません。

         eg:后台记录操作日志,监控内存,垃圾回收等待

やっと

こちらをご覧いただきありがとうございます。読んだ後、ご不明な点がありましたらコメント欄でお尋ねください。記事が役に立ったと思われる場合は、高く評価してください。Java関連の技術記事や業界情報を毎日共有します。記事を転送してください!

おすすめ

転載: blog.csdn.net/weixin_47277170/article/details/108293878