자바 병렬 프로 그래 밍 - 스 레 드 join () 예제

6216 단어 jion()
Java7 API:  http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html#join()
public final void join()
                throws InterruptedException
Waits for this thread to die.
An invocation of this method behaves in exactly the same way as the invocation
join(0)
Throws:
InterruptedException - if any thread has interrupted the current thread. The interrupted status of the current thread is cleared when this exception is thrown.
public final void join(long millis)
                throws InterruptedException
Waits at most millis milliseconds for this thread to die. A timeout of 0 means to wait forever.
This implementation uses a loop of this.wait calls conditioned on this.isAlive. As a thread terminates the this.notifyAll method is invoked. It is recommended that applications not use wait, notify, or notifyAll on Thread instances.

Parameters:
millis - the time to wait in milliseconds
Throws:
IllegalArgumentException - if the value of millis is negative
InterruptedException - if any thread has interrupted the current thread. The interrupted status of the current thread is cleared when this exception is thrown.
public final void join(long millis,
        int nanos)
                throws InterruptedException
Waits at most millis milliseconds plus nanos nanoseconds for this thread to die.
This implementation uses a loop of this.wait calls conditioned on this.isAlive. As a thread terminates the this.notifyAll method is invoked. It is recommended that applications not use wait, notify, or notifyAll on Thread instances.

Parameters:
millis - the time to wait in milliseconds
nanos - 0-999999 additional nanoseconds to wait
Throws:
IllegalArgumentException - if the value of millis is negative, or the value of nanos is not in the range 0-999999
InterruptedException - if any thread has interrupted the current thread. The interrupted status of the current thread is cleared when this exception is thrown.

Java Tourial: http://docs.oracle.com/javase/tutorial/essential/concurrency/join.html
Joins

The join method allows one thread to wait for the completion of another. If t is a Thread object whose thread is currently executing,
t.join();
causes the current thread to pause execution until t's thread terminates. Overloads of join allow the programmer to specify a waiting period. However, as with sleep, join is dependent on the OS for timing, so you should not assume that join will wait exactly as long as you specify.

Like sleep, join responds to an interrupt by exiting with an InterruptedException.

쓸모
     t. jion () 은 현재 스 레 드 를 정지 시 키 고 스 레 드 t 가 종 료 될 때 까지 계속 실행 합 니 다.
    이렇게 하면 다 중 스 레 드 에서 스 레 드 의 실행 순 서 를 확보 할 수 있다.
코드 1:
public class CustomThread1 extends Thread
{
    public CustomThread1()
    {
        super("CustomThread1");
    }
    @Override
    public void run()
    {
        String threadName = Thread.currentThread().getName();
        System.out.println(threadName + " start.");
        try
        {
            for (int i = 0; i < 5; i++)
            {
                Thread.sleep(1000);
                System.out.println(threadName + " loop at " + i);                
            }
            System.out.println(threadName + " end.");
        } catch (Exception e)
        {
            System.out.println("Exception from " + threadName + ".run");
        }
    }
}

public class CustomThread2 extends Thread
{
    CustomThread1 t1;

    public CustomThread2(CustomThread1 t1)
    {
        super("CustomThread2");
        this.t1 = t1;
    }

    @Override
    public void run()
    {
        String threadName = Thread.currentThread().getName();
        System.out.println(threadName + " start.");
        try
        {
            System.out.println("t1 join again");
            t1.join();
            System.out.println("t1 joined again");
            System.out.println(threadName + " end.");
        } catch (Exception e)
        {
            System.out.println("Exception from " + threadName + ".run");
        }
    }
}

public class JoinTestDemo
{
    public static void main(String[] args)
    {
        String threadName = Thread.currentThread().getName();
        System.out.println(threadName + " start.");
        CustomThread1 t1 = new CustomThread1();
        CustomThread2 t2 = new CustomThread2(t1);
        try
        {
            t1.start();
            Thread.sleep(3000);
            System.out.println("t1 jion");
            t1.join();
            System.out.println("t1 jioned");
            t2.start();
            System.out.println("t2 jion");
            t2.join();
            System.out.println("t2 jioned");
        } catch (Exception e)
        {
            System.out.println("Exception from main");
        }
        
        System.out.println(threadName + " end !");
    }
}

코드 1 실행 결과:
main start.
CustomThread1 start.
CustomThread1 loop at 0
CustomThread1 loop at 1
t1 jion
CustomThread1 loop at 2
CustomThread1 loop at 3
CustomThread1 loop at 4
CustomThread1 end.
t1 jioned
t2 jion
CustomThread2 start.
t1 join again
t1 joined again
CustomThread2 end.
t2 jioned
main end !

코드 2:
코드 1 에서 JointTestDemo 클래스 의 main 방법의 try 를 다음 과 같이 빨리 수정 합 니 다.
t1.start();
            Thread.sleep(3000);
            //System.out.println("t1 jion");
            //t1.join();
            //System.out.println("t1 jioned");
            t2.start();
            //System.out.println("t2 jion");
            //t2.join(); 
            //System.out.println("t2 jioned");

코드 2 실행 결과:
main start.
CustomThread1 start.
CustomThread1 loop at 0
CustomThread1 loop at 1
CustomThread1 loop at 2
main end !
CustomThread2 start.
t1 join again
CustomThread1 loop at 3
CustomThread1 loop at 4
CustomThread1 end.
t1 joined again
CustomThread2 end.

참고 자료:http://blog.csdn.net/bzwm/article/details/3881392

좋은 웹페이지 즐겨찾기