ホームページ  >  記事  >  Java  >  Java でのマルチスレッドのブロックとウェイクアップのサンプル コード

Java でのマルチスレッドのブロックとウェイクアップのサンプル コード

黄舟
黄舟オリジナル
2017-09-29 10:05:551653ブラウズ

この記事では、主に Java マルチスレッドのブロックとウェイクアップに関する内容を共有します。この記事を通じて、スレッドのブロック状態と実行可能状態に入る方法を大まかに理解できます。

Java スレッドのブロックとウェイクアップ

1. sleep() メソッド:

sleep (…ミリ秒)、この時間内にスレッドがスレッド ブロック状態に入る時間をミリ秒単位で指定します。この期間、CPU タイム スライスは取得されません。時間が経過すると、スレッドは再び実行可能状態になります。 (スレッドを一時停止すると、ロックは解放されません)


//测试sleep()方法
class Thread7 implements Runnable{
  @Override
  public void run() {
    for(int i=0;i<50;i++){
      System.out.println(Thread.currentThread().getName()+"num="+i);
      try {
        Thread.sleep(500);
      } catch (InterruptedException e) {
        e.printStackTrace();
      }
    }
  }
}
class Thread8 implements Runnable{
  @Override
  public void run() {
    for(int i=0;i<1000;i++){
      System.out.println(Thread.currentThread().getName()+"num="+i);
    }
  }
}
public static void main(String[] args) {
    /*
     * 测试线程阻塞
     */
    //测试sleep()方法
    Thread7 t7=new Thread7();
    Thread8 t8=new Thread8();
    Thread t81=new Thread(t8, "饺子");
    Thread t71=new Thread(t7, "包子");
    Thread t72=new Thread(t7, "面包");
    t71.start();
    t81.start();
    t72.start();
  }

2.suspend() メソッドとresume() メソッド:。

スレッドをサスペンドおよびウェイクアップする。suspend() は、対応するresume() が呼び出された場合にのみ、スレッドを実行可能状態にします。 (デッドロックが発生しやすいため、推奨されません)


//测试suspend()和resume()方法
class Thread9 implements Runnable{
  @Override
  public void run() {
    for(long i=0;i<500000000;i++){
System.out.println(Thread.currentThread().getName()+" num= "+i);
    }
  }
}
public static void main(String[] args) {
  //测试suspend和resume
    Thread9 t9=new Thread9();
    Thread t91=new Thread(t9,"包子");
    t91.start();
    try {
      Thread.sleep(2000);
    } catch (InterruptedException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
    t91.suspend();
    try {
      Thread.sleep(2000);
    } catch (InterruptedException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
    t91.resume();
}

(コンソールが出力を印刷するとき、2 秒間一時停止してから印刷を続行します。)

3. yield() メソッド:

これにより、スレッドは現在割り当てられている CPU タイム スライスを放棄しますが、この時点ではスレッドはまだ実行可能な状態にあり、いつでも再度 CPU タイム スライスを割り当てることができます。 yield() メソッドは、同じ優先度のスレッドにのみ実行の機会を与えます。 yield() を呼び出すことの効果は、スケジューラーがスレッドが別のスレッドに移動するのに十分な時間を実行したとみなすことと同じです。 (実行中のスレッドを一時停止し、他のスレッドを実行します。指定された時間は不明です)


//测试yield()方法
class Thread10 implements Runnable{
  @Override
  public void run() {
    for(int i=0;i<100;i++){
      System.out.println(Thread.currentThread().getName()+" num= "+i);
      if(i==33){
        Thread.yield();
      }
    }
  }
}

public static void main(String[] args) {
  //测试yield
    Thread10 t10 =new Thread10();
    Thread t101=new Thread(t10, "包子");
    Thread t102=new Thread(t10, "面包");
    t101.start();
    t102.start();
}
/*
运行结果为:
……
包子 num= 24
包子 num= 25
包子 num= 26
包子 num= 27
包子 num= 28
包子 num= 29
包子 num= 30
包子 num= 31
包子 num= 32
包子 num= 33
面包 num= 0
面包 num= 1
面包 num= 2
面包 num= 3
……
面包 num= 30
面包 num= 31
面包 num= 32
面包 num= 33
包子 num= 34
包子 num= 35
包子 num= 36
包子 num= 37
包子 num= 38
……
*/

(数値が 33 の場合、交互が発生していることがわかります。)

4.と、notify() メソッド:

この 2 つのメソッドは一緒に使用され、wait() はスレッドをブロック状態にします。notify() が呼び出されると、スレッドは実行可能状態になります。 wait() でパラメータを追加するかどうかを指定できます。パラメータを追加する場合、単位はミリ秒です。指定された時間に達するか、notify() メソッドが呼び出されると、実行可能状態になります。 (Thread クラスではなく Object クラスに属しているため、wait() は最初にロックされたオブジェクトを解放し、その後待機アクションを実行します。wait() で待機したオブジェクトは最初にロックする必要があるため、同期のみに使用できます) . プログラム セグメントまたは同期されたメソッド。それ以外の場合は、IllegalMonitorStateException がスローされます。)


//测试wait()和notify()方法
//用生产者和消费者模式模拟这一过程
/*消费者 */
class Consumer implements Runnable {
private Vector obj;
  public Consumer(Vector v) {
    this.obj = v;
  }
  public void run() {
    synchronized (obj) {
      while (true) {
        try {
          if (obj.size() == 0) {
            obj.wait();
          }
          System.out.println("消费者:我要买面包。");
          System.out.println("面包数: " + obj.size());
          obj.clear();
          obj.notify();
        } catch (Exception e) {
          e.printStackTrace();
        }
      }
    }
  }
}
/* 生产者 */
class Producter implements Runnable {
  private Vector obj;
  public Producter(Vector v) {
    this.obj = v;
  }
  public void run() {
    synchronized (obj) {
      while (true) {
        try {
          if (obj.size() != 0) {
            obj.wait();
          }
          obj.add(new String("面包"));
          obj.notify();
          System.out.println("生产者:面包做好了。");
          Thread.sleep(500);
        } catch (Exception e) {
          e.printStackTrace();
        }
      }
    }
  }
}
public static void main(String[] args) {
  //测试wait()和notify()
    Vector obj = new Vector();
    Thread consumer = new Thread(new Consumer(obj));
    Thread producter = new Thread(new Producter(obj));
    consumer.start();
    producter.start();
}

5. join() メソッド

は、スレッド結合とも呼ばれます。現在のスレッド A は、別のスレッド B の join() メソッドを呼び出します。現在のスレッド A は、スレッド B の実行が終了するまでブロッキング状態から実行可能状態に変わりません。


りー

概要

以上がJava でのマルチスレッドのブロックとウェイクアップのサンプル コードの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。