Java5 멀티스레드

4892 단어
Java5의 다중 스레드 방식
1: 3개의 신규 멀티스레드 패키지
자바 5.0에 세 개의 다중 스레드 패키지가 추가되었습니다: 자바.util.concurrent, java.util.concurrent.atomic, java.util.concurrent.locks.
  • java.util.concurrent는 자주 사용하는 다중 루틴 도구를 포함하고 있으며 새로운 다중 루틴 도구의 주체입니다.
  • java.util.concurrent.atomic에는 AtomicInteger가 addandAndGet () 방법을 제공하는 등 잠금 없이 값을 바꿀 수 있는 원자 변수가 포함되어 있습니다.Add와 Get은 서로 다른 작업입니다. 다른 라인이 방해되지 않도록 하기 위해서, 이전에는 공유된 변수를 잠그고 잠긴 범위 내에서 두 가지 작업을 했습니다.하지만 Atomic Integer를 사용합니다.AddAndGet () 는 잠금에 대해 걱정할 필요가 없습니다. 내부 구현은 이 두 단계의 조작이 원자량급에서 발생하고 다른 라인에 의해 방해되지 않도록 보장합니다.
  • java.util.concurrent.locks 패키지는 잠금 도구를 포함합니다.

  • 2: Callable 및 Future 커넥터
    Callable는 Runnable와 유사한 인터페이스입니다. Callable 인터페이스를 실현하는 클래스와 Runnable를 실현하는 클래스는 다른 라인에서 수행할 수 있는 작업입니다.Callable과 Runnable은 몇 가지 차이점이 있습니다.
  • Callable에 규정된 방법은call()이고Runnable에 규정된 방법은run()이다.
  • Callable의 작업은 실행된 후에 값을 되돌릴 수 있지만 Runnable의 작업은 값을 되돌릴 수 없습니다.
  • call() 방법은 이상을 던질 수 있지만run() 방법은 이상을 던질 수 없습니다.
  • Callable 작업을 실행하면 Future 대상을 얻을 수 있습니다. Future 대상을 통해 작업 수행 상황을 알 수 있고 작업 수행을 취소할 수 있으며 작업 수행의 결과를 얻을 수 있습니다.

  • 3: Executor, Executor 서비스 및 ScheduledExecutor 서비스
    4: Lockers 및 Condition 커넥터
    다중 루틴 프로그래밍에서 중요한 개념은 잠금이다. 만약에 한 자원이 여러 루틴으로 공유된다면 데이터의 완전성을 확보하기 위해 사무적인 조작을 할 때 공유 자원을 잠금해야 한다. 이렇게 하면 사무적인 조작을 할 때 한 라인만 자원에 대해 조작을 할 수 있고 데이터의 완전성을 확보할 수 있다.5.0 이전에 잠금 기능은 Synchronized 하이픈으로 이루어졌는데 다음과 같은 몇 가지 문제가 있었습니다.
  • 한 번에 한 객체만 잠글 수 있습니다.여러 개의 대상을 잠가야 한다면 프로그래밍이 비교적 번거롭고 자칫 잠금 현상이 나타날 수 있다.
  • 만약에 라인이 잠금을 받지 못해 대기 상황에 들어가면 끊을 방법이 없다
  • 작업에 필요한 다중 스레드 시퀀스 제어 (하위 스레드는 주 스레드가 어떤 방법을 실행한 후에 실행될 때까지 기다립니다)
    JAVA에서는 PV 작업, 프로세스 상호 배척 등과 유사한 방법이 없습니다.JAVA의 프로세스 동기화는 synchronized () 를 통해 이루어진 것으로, JAVA의 synchronized () 방법은 운영체제 개념의 상호 배척 메모리 블록과 유사하며, JAVA의 Object 유형에서 모두 하나의 메모리 자물쇠를 가지고 있으며, 이 메모리 자물쇠를 얻은 후 다른 루트가 이 메모리에 접근할 수 없기 때문에 JAVA의 간단한 동기화, 상호 배척 조작을 실현할 수 있다.이 원리를 이해하면 왜synchronized(this)와synchronized(static XXX)의 차이를 이해할 수 있다. synchronized는 메모리 블록에 대해 메모리 자물쇠를 신청하는데this 키워드는 클래스를 대표하는 대상이기 때문에 그 메모리 자물쇠는 같은 대상에 대한 상호 배척 작업이고 static 구성원은 클래스 전유에 속하며 그 메모리 공간은 이 클래스의 모든 구성원에게 공유되기 때문에synchronized()는static 구성원에 자물쇠를 추가하고클래스에 대한 잠금, 즉 이 클래스의 모든 구성원 간에 상호 배척을 실현하고 같은 시간에 하나의 라인만 이 클래스에 접근할 수 있는 실례에 해당한다.JAVA에 있는 라인의 상호 배척을 간단하게 실현하고 싶다면, 이 기본들을 알면 충분하다.하지만 온라인 거리에서 서로를 깨워야 한다면 Object를 빌려야 한다.wait(), Object.nofity()입니다.
        Obj.wait(), Obj.notify ()는synchronized (Obj) 와 함께 사용해야 합니다. 즉 wait입니다. notify와는 이미 Obj 자물쇠를 획득한 것에 대한 작업으로 문법적으로 Obj입니다.wait(),Obj.notify는 synchronized(Obj) {...}에 있어야 합니다.문장 블록 안.기능적으로wait는 라인이 대상 자물쇠를 획득한 후에 대상 자물쇠를 주동적으로 방출하고 이 라인이 휴면하는 것을 말한다.다른 스레드 호출 대상이 있는 notify () 가 이 스레드를 깨울 때까지 대상 자물쇠를 계속 가져오고 실행할 수 있습니다.상응하는 notify () 는 대상 자물쇠를 깨우는 동작입니다.그러나 주의해야 할 것은 notify () 호출 후 바로 대상 자물쇠를 방출하는 것이 아니라 해당하는synchronized () {} 문장 블록의 실행이 끝나면 자동으로 자물쇠를 방출한 후 JVM은wait () 대상 자물쇠의 라인에서 무작위로 한 라인을 선택하여 대상 자물쇠를 부여하고 라인을 깨우며 계속 집행한다.이렇게 하면 온라인 거리 사이의 동기화, 깨우는 조작을 제공할 수 있다.Thread.sleep() 및 Object.wait () 양자는 모두 현재 라인을 멈추고 CPU 제어권을 방출할 수 있는데, 주요한 차이점은 Object에 있다.wait () 는 CPU를 방출하는 동시에 대상 자물쇠의 제어를 방출합니다.
    public class testThread {
    	/**
    	 * @param args
    	 *                          
    	 */
    	public static void main(String[] args) throws InterruptedException {
    		
    		    final testThread  test = new testThread();
    		    System.out.println("Main Thread start..."+Thread.currentThread().getId());
                new Thread(new Runnable(){
    
    				@Override
    				public void run() {
    					  synchronized(test){
    					    try {
    							test.wait();//             
    						} catch (InterruptedException e) {
    							e.printStackTrace();
    						}
    					  }
    					System.out.println("Thread1 sleep run...."+Thread.currentThread().getId());
    				}
                }).start();
                
                Thread.sleep(4000);//     ,  CPU,Thread1       。
                System.out.println("Main Thread end..."+Thread.currentThread().getId());
                
                synchronized(test){
    			    test.notify();
    			}
    	}
    }
    

    전통과 신조(Java5) 두 가지 방법으로 필기시험 문제를 해결하다
    세 개의 스레드를 만들고 A스레드는 10번 A, B스레드는 10번 B, C스레드는 10번 C를 인쇄하며 스레드가 동시에 운행하도록 요구하며 10번 ABC를 교대로 인쇄한다.
    http://blog.csdn.net/zyplus/article/details/6672775
    package com.sort;
    
    public class testThread2 {
    	static class MyThread implements Runnable{
    		String str ;
    		public MyThread(String str){
    			this.str = str;
    		}
    		@Override
    		public void run() {
    			  for(int i=0;i<10;i++){
    				  System.out.println("thread ...."+Thread.currentThread().getId()+"  "+str);
    			  }
    		}
    		
    	}
    
    	public static void main(String[] args) throws InterruptedException {
    		  
    		MyThread thread1 = new MyThread("A");
    		MyThread thread2 = new MyThread("B");
    		MyThread thread3 = new MyThread("c");
    		
    		new Thread(thread1).start();
    		new Thread(thread2).start();
    		new Thread(thread3).start();
    	}
    }
    

    좋은 웹페이지 즐겨찾기