> Java > java지도 시간 > Java에서 멀티스레딩의 몇 가지 기본 방법 사용 소개(예제 포함)

Java에서 멀티스레딩의 몇 가지 기본 방법 사용 소개(예제 포함)

不言
풀어 주다: 2018-10-08 15:12:34
앞으로
2600명이 탐색했습니다.

이 기사는 Java의 멀티스레딩에 대한 몇 가지 기본 방법을 소개합니다(예제 포함). 필요한 친구가 참고할 수 있기를 바랍니다.

Thread sleep sleep()

Thread.sleep (밀리초) sleep 메소드를 통해 스레드를 절전 모드로 설정할 수 있습니다. sleep이 정적 메서드라는 것을 알 수 있습니다

public static native void sleep(long var0) throws InterruptedException;
로그인 후 복사
    try {
        System.out.println(new Date().getSeconds());
        Thread.sleep(5000);
        System.out.println(new Date().getSeconds());
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
로그인 후 복사

setDaemon 데몬 스레드

데몬이 아닌 스레드가 중지되고 데몬 스레드가 자동으로 종료됩니다

    public static void main(String[] args) {
        Thread thread1 = new Thread() {
            @Override
            public void run() {
                super.run();
                for(int i = 0; i < 5; i ++) {
                    System.out.println("非守护线程");
                }
            }
        };

        Thread thread2 = new Thread() {
            @Override
            public void run() {
                for(int i = 0; i < 200; i ++) {
                    System.out.println("守护线程");
                }
            }
        };

        thread2.setDaemon(true);
        thread1.start();
        thread2.start();
    }
로그인 후 복사

thread2가 200개의 출력을 실행해야 했지만 몇 줄만 실행했음을 분명히 알 수 있습니다. 여기서 출력되었습니다. thread1이 실행을 완료하면 thread2가 자동으로 데몬 스레드로 중지되기 때문입니다.
Java에서 멀티스레딩의 몇 가지 기본 방법 사용 소개(예제 포함)

Multi-threaded jion

jion 메서드가 실행되면 현재 스레드를 중지하고 jion()을 실행한 스레드를 먼저 실행합니다. 이는 큐 점프 실행과 동일합니다. 다음과 같이 thread2 스레드를 실행할 때 i==20인 경우 thread1이 대기열에서 점프하도록 하고 먼저

    public static void main(String[] args) {
        final Thread thread1 = new Thread() {
            @Override
            public void run() {
            super.run();
            for(int i = 0; i < 500; i ++) {
                System.out.println("thread1---" + i);
            }
            }
        };

        Thread thread2 = new Thread() {
            @Override
            public void run() {
                for(int i = 0; i < 200; i ++) {
                    if (i == 20) {
                        try {
                            //插队执行
                            thread1.join();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                    System.out.println(i);
                }
            }
        };
        thread1.start();
        thread2.start();
    }
로그인 후 복사

join() 메서드를 실행합니다. 또한 긴 밀리초 조인(밀리초)
매개변수를 전달할 수 있습니다. 이는 스레드가 조인을 실행함을 의미합니다. 대기열로 점프하여 XXX 밀리초 후에 실행됩니다. 시간이 지나면 두 스레드가 교대로 실행됩니다.

   public static void main(String[] args) {
        final Thread thread1 = new Thread() {
            @Override
            public void run() {
            super.run();
            for(int i = 0; i < 500; i ++) {
                System.out.println("thread1---" + i);
            }
            }
        };

        Thread thread2 = new Thread() {
            @Override
            public void run() {
                for(int i = 0; i < 200; i ++) {
                    if (i == 20) {
                        try {
                            //插队执行1毫秒
                            thread1.join(1);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                    System.out.println(i);
                }
            }
        };
        thread1.start();
        thread2.start();
    }
로그인 후 복사

yeild 특별 스레드

yeild는 CPU를 포기하고 다른 스레드가 실행되도록 합니다.

    public static void main(String[] args) {
        final Thread thread1 = new Thread() {
            @Override
            public void run() {
            super.run();
            for(int i = 0; i < 500; i ++) {
                System.out.println( getName() + "---" + i);
            }
            }
        };

        Thread thread2 = new Thread() {
            @Override
            public void run() {
                for(int i = 0; i < 200; i ++) {
                    if (i % 5 == 0) {
                        Thread.yield();
                    }
                    System.out.println(getName() + "---" + i);
                }
            }
        };
        thread1.start();
        thread2.start();
    }
로그인 후 복사

setPriority는 스레드의 우선 순위를 설정합니다

기본 우선순위는 5이고 최소값은 1, 최대값은 10입니다.
클수록 우선순위가 높아집니다

    public static void main(String[] args) {
        final Thread thread1 = new Thread() {
            @Override
            public void run() {
            super.run();
            for(int i = 0; i < 500; i ++) {
                System.out.println( getName() + "---" + i);
            }
            }
        };

        Thread thread2 = new Thread() {
            @Override
            public void run() {
                for(int i = 0; i < 500; i ++) {

                    System.out.println(getName() + "---" + i);
                }
            }
        };
        //设置最大的线程优先级最大为10
        thread1.setPriority(Thread.MIN_PRIORITY);
        //设置最小的线程优先级,最小为1
        thread2.setPriority(Thread.MAX_PRIORITY);
        thread1.start();
        thread2.start();
    }
로그인 후 복사

synchronized

동기화된 코드 블록

여러 스레드가 동시에 실행되고 여러 코드 조각이 동시에 실행되는 경우 같은 시간. 코드를 실행할 때 CPU가 스레드를 전환하지 않기를 바랍니다

동기화를 사용하지 않는 경우

동기화를 사용하지 않으면 어떻게 되는지 살펴보겠습니다

public class ThreadSynchronied {

    public static void main(String[] args) {
        final Say say = new Say();

         Thread thread1 = new Thread() {
            @Override
            public void run() {
                for (int i = 0 ; i < 10000 ; i ++) {
                    say.say();
                }
            }
        };

        Thread thread2 = new Thread() {
            @Override
            public void run() {
                for (int i = 0 ; i < 10000 ; i ++) {
                    say.say1();
                }
            }
        };
        //设置最大的线程优先级最大为10
        thread1.setPriority(Thread.MIN_PRIORITY);
        //设置最小的线程优先级,最小为1
        thread2.setPriority(Thread.MAX_PRIORITY);
        thread1.start();
        thread2.start();
    }
}

class Say {
    void say() {
        System.out.print("s ");
        System.out.print("a ");
        System.out.print("y ");
        System.out.print("h ");
        System.out.print("e ");
        System.out.print("l ");
        System.out.print("l ");
        System.out.println("o");
    }

    void say1() {
        System.out.print("1 ");
        System.out.print("2 ");
        System.out.print("3 ");
        System.out.print("4 ");
        System.out.print("5 ");
        System.out.print("6 ");
        System.out.print("7 ");
        System.out.println("8");
    }
}
로그인 후 복사

Java에서 멀티스레딩의 몇 가지 기본 방법 사용 소개(예제 포함)

일부 출력이 그렇지 않은 것을 발견했습니다 완전히 인쇄됩니다. 스레드 thread1을 실행할 때 프로세스에서 CPU는 스레드2에 의해 선점됩니다. 이 경우에는 확실히 우리의 비즈니스 논리와 일치하지 않습니다. 따라서 스레드가 완전한 메소드를 실행한 후에만 CPU가 다른 스레드에 의해 선점되도록 해야 합니다

동기화 사용

public class ThreadSynchronied {

    public static void main(String[] args) {
        final Say say = new Say();

         Thread thread1 = new Thread() {
            @Override
            public void run() {
                for (int i = 0 ; i < 10000 ; i ++) {
                    say.say();
                }
            }
        };

        Thread thread2 = new Thread() {
            @Override
            public void run() {
                for (int i = 0 ; i < 10000 ; i ++) {
                    say.say1();
                }
            }
        };
        //设置最大的线程优先级最大为10
        thread1.setPriority(Thread.MIN_PRIORITY);
        //设置最小的线程优先级,最小为1
        thread2.setPriority(Thread.MAX_PRIORITY);
        thread1.start();
        thread2.start();
    }
}

class Say {
    String s = "hahaah";

    void say() {
        synchronized (s) {
            System.out.print("s ");
            System.out.print("a ");
            System.out.print("y ");
            System.out.print("h ");
            System.out.print("e ");
            System.out.print("l ");
            System.out.print("l ");
            System.out.println("o");
        }
    }

    void say1() {
        synchronized (s) {
            System.out.print("1 ");
            System.out.print("2 ");
            System.out.print("3 ");
            System.out.print("4 ");
            System.out.print("5 ");
            System.out.print("6 ");
            System.out.print("7 ");
            System.out.println("8");
        }
    }
}
로그인 후 복사

Java에서 멀티스레딩의 몇 가지 기본 방법 사용 소개(예제 포함)

동기화 동기화 코드 블록을 사용한 후에는 위의 상황이 발생하지 않는다는 것을 발견했습니다

동기화 방식

public class ThreadSynchroniedMethod {

    public static void main(String[] args) {
        final Say say = new Say();

         Thread thread1 = new Thread() {
            @Override
            public void run() {
                for (int i = 0 ; i < 10000 ; i ++) {
                    say.say();
                }
            }
        };

        Thread thread2 = new Thread() {
            @Override
            public void run() {
                for (int i = 0 ; i < 10000 ; i ++) {
                    say.say1();
                }
            }
        };
        //设置最大的线程优先级最大为10
        thread1.setPriority(Thread.MIN_PRIORITY);
        //设置最小的线程优先级,最小为1
        thread2.setPriority(Thread.MAX_PRIORITY);
        thread1.start();
        thread2.start();
    }
}

class Say {
    //在方法上加锁
    static synchronized void say() {
            System.out.print("s ");
            System.out.print("a ");
            System.out.print("y ");
            System.out.print("h ");
            System.out.print("e ");
            System.out.print("l ");
            System.out.print("l ");
            System.out.println("o");

    }

     static void say1() {
        synchronized (Say.class) {
            System.out.print("1 ");
            System.out.print("2 ");
            System.out.print("3 ");
            System.out.print("4 ");
            System.out.print("5 ");
            System.out.print("6 ");
            System.out.print("7 ");
            System.out.println("8");
        }
    }
}
로그인 후 복사

동기화 방식은 잠금 방식을 뜻합니다

정적 동기화 방식의 객체는 클래스의 바이트코드 객체입니다
비정적 동기화 방식의 잠금 객체는 바로 이것입니다

여러 스레드가 동일하게 사용하는 교착상태가 발생하기 쉬운 리소스 잠금

교착상태란 무엇인가요?

두 개 이상의 프로세스가 실행 중에 리소스를 두고 경쟁하거나 서로 통신하여 발생하는 차단 현상을 말하며 외부의 힘이 없으면 불가능합니다. 앞으로 나아가십시오. 이때 시스템이 교착상태(deadlock) 상태에 있거나 시스템에 교착상태가 발생했다고 한다. 이렇게 항상 서로를 기다리고 있는 프로세스를 교착상태 프로세스(deadlock process)라고 한다.

스레드 안전 클래스

Vector
StringBuffer
HashTable

Thread unsafe

ArrayList
StringBuilder
HashSet

java.util.Collections에는synchronousdList와 같은 메소드가 있어 스레드 안전하지 않은 컬렉션을 스레드로 변환할 수 있습니다. -
Java에서 멀티스레딩의 몇 가지 기본 방법 사용 소개(예제 포함)

안전합니다.

위 내용은 Java에서 멀티스레딩의 몇 가지 기본 방법 사용 소개(예제 포함)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:cnblogs.com
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿