java 다중 루틴 - 막힘과 깨우기

12641 단어 java 다중 루틴
3. 자바 라인의 막힘 및 깨우기 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 타임 슬라이드를 포기하지만, 이 타임 슬라이드는 실행 가능한 상태여서 언제든지 다시 분배할 수 있습니다.ield () 방법은 같은 우선순위의 라인만 실행할 수 있습니다.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() 방법: 두 가지 방법을 조합하여 사용하고wait()는 라인을 막힌 상태로 만들고 notify()를 호출할 때 라인은 실행 가능한 상태로 들어간다.wait () 내에 파라미터를 추가할 수 있거나 추가할 수 없습니다. 파라미터를 추가할 때는 밀리초 단위이고, 지정된 시간이 되거나 notify () 방법을 호출할 때 실행 가능한 상태로 들어갑니다.(Object 클래스에 속하고 Thread 클래스에 속하지 않으며, wait()는 잠긴 객체를 먼저 해제한 다음 기다리는 작업을 수행합니다.wait()가 기다리는 대상은 먼저 잠궈야 하기 때문에 동기화 프로그램이나 동기화 방법에서만 사용할 수 있습니다. 그렇지 않으면 이상 Illegal Monitor State Exception을 던집니다.)
//  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가 실행될 때까지 차단 상태에서 실행 가능한 상태로 전환됩니다.
//  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  
*/

좋은 웹페이지 즐겨찾기