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.wait()とnotify()メソッド:2つのメソッドを組み合わせて使用し、wait()がスレッドをブロック状態にし、notify()を呼び出すと、スレッドは実行可能状態に入ります.wait()にはパラメータを追加または追加しないことができ、パラメータを追加する場合はミリ秒単位で、指定された時間またはnotify()メソッドを呼び出すと実行可能な状態になります.(Objectクラスに属し、Threadクラスに属しない場合、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()メソッドであり、現在のスレッドはスレッドBの実行が終了するまで、スレッドAがブロック状態から実行可能状態に移行する.
// join
class Thread11 implements Runnable{
    @Override
    public void run() {
        System.out.println("Start Progress.");
        try {
            for(int i=0;i<5;i++){
                System.out.println("Thread11  : "+i);
                Thread.sleep(1000);
            }
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        System.out.println("End Progress.");
    }
}

public static void main(String[] args) {
    // join
        Thread11 t11=new Thread11();
        Thread t111=new Thread(t11);
        t111.start();
        try {
            t111.join();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        System.out.println("hi,I'm Main ");
}
/*
 :
Start Progress.
Thread11  : 0
Thread11  : 1
Thread11  : 2
Thread11  : 3
Thread11  : 4
End Progress.
hi,I'm Main 
*/