Java5 멀티스레드
1: 3개의 신규 멀티스레드 패키지
자바 5.0에 세 개의 다중 스레드 패키지가 추가되었습니다: 자바.util.concurrent, java.util.concurrent.atomic, java.util.concurrent.locks.
2: Callable 및 Future 커넥터
Callable는 Runnable와 유사한 인터페이스입니다. Callable 인터페이스를 실현하는 클래스와 Runnable를 실현하는 클래스는 다른 라인에서 수행할 수 있는 작업입니다.Callable과 Runnable은 몇 가지 차이점이 있습니다.
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();
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.