이 기사는 Java의 멀티스레딩에 대한 몇 가지 기본 방법을 소개합니다(예제 포함). 필요한 친구가 참고할 수 있기를 바랍니다.
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(); }
데몬이 아닌 스레드가 중지되고 데몬 스레드가 자동으로 종료됩니다
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가 자동으로 데몬 스레드로 중지되기 때문입니다.
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는 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(); }
기본 우선순위는 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(); }
여러 스레드가 동시에 실행되고 여러 코드 조각이 동시에 실행되는 경우 같은 시간. 코드를 실행할 때 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"); } }
일부 출력이 그렇지 않은 것을 발견했습니다 완전히 인쇄됩니다. 스레드 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"); } } }
동기화 동기화 코드 블록을 사용한 후에는 위의 상황이 발생하지 않는다는 것을 발견했습니다
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
ArrayList
StringBuilder
HashSet
java.util.Collections에는synchronousdList와 같은 메소드가 있어 스레드 안전하지 않은 컬렉션을 스레드로 변환할 수 있습니다. -
위 내용은 Java에서 멀티스레딩의 몇 가지 기본 방법 사용 소개(예제 포함)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!