java 멀티스레드 프로그래밍 핵심 기술 1-Thread 기초 지식

하나.Java 멀티스레드 기술:
1. 프로세스가 실행 중일 때 최소한 하나의 라인이 실행 중일 수 있으며main 방법의 라인은 JVM에서 만들어졌으며 jps를 통해 검출될 수 있습니다.
2. 다중 스레드 기술을 사용할 때 코드의 운행 결과는 코드의 집행 순서나 호출 순서와 무관하다.
3. new Thread(Runnable target)는 Runnable 인터페이스의 대상뿐만 아니라 다른 Thread 클래스의 대상도 전송할 수 있다. Thread 대상의run()을 완전히 전송할 수 있다.
방법은 다른 라인에 맡겨 호출한다.
4.main 방법에서 라인을 만들고 start () 를 호출합니다. 라인의 구조 방법은main 라인에서 실행되며, 런 방법은 대응하는 라인에서 실행됩니다. 그러나 라인의 런 방법을 직접 호출하면 그것도main 라인에서 실행됩니다.
5. isAlive() 방법: 현재 스레드가 활성 상태인지 판단합니다. 주의: 스레드 대상을 구조 파라미터로 Thread 대상에게 start()를 전달할 때this가 가리키는 스레드 대상, Thread.currentThread() 또는 this.Thread.currentThread ()는 Thread 대상, Thread 대상일 때 살아남는 (isalive)
6. Thread.sleep () 방법: 현재 라인을 휴면시킵니다.main 방법에서 라인 종류의run 방법을 호출하여 라인을 실행하면 Thread입니다.sleep ()는run 방법에서 휴면하는main 라인입니다 (this.currentThread (인쇄를 통해).getName () 인증
7. getId () 방법의 유일한 역할은 라인의 유일한 표식을 얻는 것이다.
둘.스레드 중단:
1. 인터럽트 () 를 통해 인터럽트:
1. thread.interrupt ():thread 대상이 대표하는 라인을 중단합니다.
2. Thread.currentThread().interrupt (): 현재 라인을 중단합니다.
3. this.interrupted()/Thread.interrupted (): 현재 라인이 중단되었는지 테스트합니다. 중단 표시가 설정되어 있으면 한 번 호출한 후에 이 표시를 지우고 다시 호출하지 않습니다.
4. this.isInterrupted()/Thread.isInterrupted(): 스레드가 중단되었는지 테스트하고 호출 후 중단 표시를 지우지 않습니다.
2. 이상법으로 중단:
    1.루틴의run 방법의 for 순환을 통해 루틴의 정지 상태를 판단합니다 (this.interrupted ().
	public class MyThread1 extends Thread {
		@Override
		public void run() {
			super.run();
			for (int i = 0; i < 500000; i++) {
				if (this.interrupted()) {
					System.out.println("        !     !");
					break;
				}
				System.out.println("i=" + (i + 1));
			}
			System.out.println("    for        ......");
		}
	}

2. 인터럽트 후 for 아래의 문장이 계속 실행되지 않도록 인터럽트가 필요할 때 인터럽트 이상을 던지고 인터럽트를 처리합니다.
	public class MyThread1 extends Thread {
		@Override
		public void run() {
			super.run();
			try {
				for (int i = 0; i < 500000; i++) {
					if (this.interrupted()) {
						System.out.println("        !     !");
						throw new InterruptedException();
					}
					System.out.println("i=" + (i + 1));
				}
				System.out.println("    for        ......");
			} catch (InterruptedException e) {
				System.out.println(" MyThread.java run    catch !");
				e.printStackTrace();
			}
		}
	}

3. 수면 중에 스레드를 정지한다.
1.sleep 먼저interrupt:sleep 상태에서 어떤 라인을 멈추면catch 문장에 들어가고 정지 상태 값을 제거하여false로 변하게 하고sleep 이후의 프로그램은 실행되지 않습니다.
2.interrupt 먼저sleep:sleep 이전에 for 순환과 같은 프로그램이 있다면 호출이 중단된 후에 for 순환의 실행에 영향을 주지 않으며,sleep가 실행될 때catch 문장에 들어가고 정지 상태 값을 제거하여false로 만듭니다.
	public class MyThread1 extends Thread {
		@Override
		public void run() {
			super.run();
			try {
				//       interrupt   ,for         
				for (int i = 0; i < 500000; i++) {
					System.out.println("i=" + (i + 1));
				}
				System.out.println("run begin");
				Thread.sleep(200000);
				System.out.println("run end");
			} catch (InterruptedException e) {
				System.out.println("   ,    sleep!  catch!");
				e.printStackTrace();
			}
		}
	}

4. 폭력 정지 라인:
  1.thread.stop (): depreated 방법입니다. 스레드가 폭력적으로 정지된 후 아이콘이 회색입니다. 스톱 방법을 호출할 때Thread Death 이상을 던져서 보통 표시할 필요가 없는 포착을 합니다.
  2.단점강제 정지 라인은 일부 이성적인 작업을 완성하지 못하게 할 수도 있다.
        2.잠긴 객체에 대한 잠금 해제를 수행하여 데이터가 동기화되지 않고 정합성이 보장되지 않는 문제가 발생했습니다.
  
5.return을 사용하여 스레드를 중지합니다.
  1.방법인interrupt()와return을 결합하여 사용해도 정지 라인의 효과를 실현할 수 있다.
	public class MyThread1 extends Thread {
		@Override
		public void run() {
			while (true) {
				if (this.isInterrupted()) {
					System.out.println("   !");
					return;
				}
				System.out.println("timer=" + System.currentTimeMillis());
			}
		}
	}

셋.스레드 일시 중지:
1.suspend() 방법으로 라인을 정지하고resume() 방법으로 라인의 실행을 회복합니다.
단점 1 - 독점:
   1.공공 대상의 독점을 초래하기 쉬워서 다른 라인이 공공 동기화 대상에 접근할 수 없습니다.
예를 들어 하나의 라인이 하나의 공공 대상의 동기화 방법에 들어간 후suspend () 는 항상 잠겨 있기 때문에 다른 라인은 이 공공 대상의 동기화 방법에 들어갈 수 없습니다.
	public class SynchronizedObject {
		synchronized public void printString() {
			System.out.println("begin");
			if (Thread.currentThread().getName().equals("a")) {
				System.out.println("a     suspend !");
				Thread.currentThread().suspend();
			}
			System.out.println("end");
		}
	}

2. 또 다른 독점적인 상황은run 방법의 프린터 문장을 놓으면main 방법의 프린터 문장은 실행되지 않는다. 프린터 방법인prinln 내부는 동기화된 코드 블록이기 때문이다.
인쇄와 줄 바꾸기 두 단계로 나뉘는데, 프로그램이 코드 블록 내부suspend로 실행될 때, 인쇄 문장의 자물쇠가 풀리지 않아main 방법의 인쇄 문장을 실행할 수 없습니다.
	public class MyThread extends Thread {
		private long i = 0;

		@Override
		public void run() {
			while (true) {
				i++;
				// System.out.println(i);
			}
		}
	}

	public class Run {
		public static void main(String[] args) {
			try {
				MyThread thread = new MyThread();
				thread.start();
				Thread.sleep(1000);
				thread.suspend();
				System.out.println("main end!");
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}

단점 2 - 동기화 중단:
1. 스레드의 정지로 인해 데이터가 동기화되지 않는 상황이 발생하기 쉽다.
즉 공유 대상의 여러 값 사이에suspend가 라인을 설정하면 이 대상의 값이 일부분만 설정되어 다른 라인이 이 대상을 사용할 때 값이 일치하지 않는 경우가 발생한다.
넷.yield 메서드:
역할: 현재 CPU 자원을 포기하고 다른 작업에 양보하지만 포기하는 시간이 확실하지 않아 방금 포기하고 바로 CPU 타임라인을 얻을 수 있습니다.
다음 예: for 순환에서 매번 yield를 한 번 더 가져오면 전체 실행 시간이 몇 배로 증가합니다. 
	public class MyThread1 extends Thread {
		@Override
		public void run() {
			long beginTime = System.currentTimeMillis();
			int count = 0;
			for (int i = 0; i < 50000000; i++) {
				// Thread.yield();
				count = count + (i + 1);
			}
			long endTime = System.currentTimeMillis();
			System.out.println("  :" + (endTime - beginTime) + "  !");
		}


	}

다섯.스레드 우선 순위:
1. setPriority(): 스레드의 우선순위를 설정하는데 사용되며, 우선순위가 높은 스레드는 CPU 자원을 많이 얻을 수 있다. 우선순위를 설정하면'스레드 기획기'가 다음에 어떤 스레드를 선택하여 우선적으로 실행할 것인지를 결정하는 데 도움이 된다.
라인 우선순위는 1~10 이 10개 등급으로 나뉘는데 이 범위 내의 우선순위가 아니면 이상을 던질 수 있습니다. 주로 1,5,10 표지는 낮음, 중간, 높은 우선순위입니다.
2. 스레드 우선순위의 계승 특성: A 스레드가 B 스레드를 시작하면 B 스레드의 우선순위는 A와 같다.
3. 스레드의 우선 순위는 규칙적입니다.
  1.우선순위가 높은 대부분의 경우 먼저 실행됩니다. 비록 시작 시간이 다른 낮은 우선순위 라인보다 늦을 수도 있지만.  
  2.'랜덤성', 우선순위가 높은 라인이 반드시 매번 먼저 실행되는 것은 아니다.
4. 결론: 라인의 우선순위와 운행 결과의 순서를 평가하는 기준으로 삼지 마라. 우선순위가 높은 라인이 반드시run() 방법의 임무를 먼저 수행하는 것은 아니다.
여섯.데몬 스레드:
1. 프로세스에 비수호 라인이 없을 때 수호 라인은 자동으로 삭제됩니다.Daemon은 다른 라인의 운행에 편리한 서비스를 제공합니다. 라인을 지키는 가장 대표적인 응용 프로그램은 GC 쓰레기 수거기입니다.
2.thread 통과.setDaemon (true) 은 수호 루트로 설정합니다.
   
	public class MyThread1 extends Thread {
		private int i = 0;

		@Override
		public void run() {
			try {
				while (true) {
					i++;
					System.out.println("i=" + (i));
					Thread.sleep(100);
				}
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}

	public class MyTest2 {
		public static void main(String[] args) throws InterruptedException {
			try {
				MyThread1 thread = new MyThread1();
				thread.setDaemon(true);
				thread.start();
				Thread.sleep(5000);
				System.out.println("   thread        ,      !");
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}

좋은 웹페이지 즐겨찾기