java 다중 루틴 - 막힘과 깨우기
12641 단어 java 다중 루틴
// sleep()
class Thread7 implements Runnable{
@Override
public void run() {
for(int i=0;i<50;i++){
System.out.println(Thread.currentThread().getName()+"num="+i);
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
class Thread8 implements Runnable{
@Override
public void run() {
for(int i=0;i<1000;i++){
System.out.println(Thread.currentThread().getName()+"num="+i);
}
}
}
public static void main(String[] args) {
/*
*
*/
// sleep()
Thread7 t7=new Thread7();
Thread8 t8=new Thread8();
Thread t81=new Thread(t8, " ");
Thread t71=new Thread(t7, " ");
Thread t72=new Thread(t7, " ");
t71.start();
t81.start();
t72.start();
}
2.suspend() 및 resume() 방법:.마운트와 깨우기 루틴,suspend ()는 루틴을 막힌 상태로 진입시키고, 대응하는resume ()가 호출될 때만 루틴이 실행 가능한 상태로 진입합니다.(사용을 권장하지 않아 자물쇠가 사라지기 쉽다)
// suspend() resume()
class Thread9 implements Runnable{
@Override
public void run() {
for(long i=0;i<500000000;i++){
System.out.println(Thread.currentThread().getName()+" num= "+i);
}
}
}
public static void main(String[] args) {
// suspend resume
Thread9 t9=new Thread9();
Thread t91=new Thread(t9," ");
t91.start();
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
t91.suspend();
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
t91.resume();
}
(콘솔에서 출력을 인쇄할 때 2초 동안 멈춘 다음 인쇄를 계속합니다.)3. yield () 방법: 현재 분배된 cpu 타임 슬라이드를 포기하지만, 이 타임 슬라이드는 실행 가능한 상태여서 언제든지 다시 분배할 수 있습니다.ield () 방법은 같은 우선순위의 라인만 실행할 수 있습니다.yield () 를 호출하는 효과는 스케줄러가 이 라인이 충분한 시간을 실행했다고 생각하고 다른 라인으로 이동하는 것과 같다.(현재 실행 중인 라인을 멈추고 다른 라인을 실행하며 시간을 알 수 없음)
// yield()
class Thread10 implements Runnable{
@Override
public void run() {
for(int i=0;i<100;i++){
System.out.println(Thread.currentThread().getName()+" num= "+i);
if(i==33){
Thread.yield();
}
}
}
}
public static void main(String[] args) {
// yield
Thread10 t10 =new Thread10();
Thread t101=new Thread(t10, " ");
Thread t102=new Thread(t10, " ");
t101.start();
t102.start();
}
/*
:
……
num= 24
num= 25
num= 26
num= 27
num= 28
num= 29
num= 30
num= 31
num= 32
num= 33
num= 0
num= 1
num= 2
num= 3
……
num= 30
num= 31
num= 32
num= 33
num= 34
num= 35
num= 36
num= 37
num= 38
……
*/
(숫자가 33일 때 모두 교체된 것을 볼 수 있다.)4.wait()와 notify() 방법: 두 가지 방법을 조합하여 사용하고wait()는 라인을 막힌 상태로 만들고 notify()를 호출할 때 라인은 실행 가능한 상태로 들어간다.wait () 내에 파라미터를 추가할 수 있거나 추가할 수 없습니다. 파라미터를 추가할 때는 밀리초 단위이고, 지정된 시간이 되거나 notify () 방법을 호출할 때 실행 가능한 상태로 들어갑니다.(Object 클래스에 속하고 Thread 클래스에 속하지 않으며, wait()는 잠긴 객체를 먼저 해제한 다음 기다리는 작업을 수행합니다.wait()가 기다리는 대상은 먼저 잠궈야 하기 때문에 동기화 프로그램이나 동기화 방법에서만 사용할 수 있습니다. 그렇지 않으면 이상 Illegal Monitor State Exception을 던집니다.)
// wait() notify()
//
/* */
class Consumer implements Runnable {
private Vector obj;
public Consumer(Vector v) {
this.obj = v;
}
public void run() {
synchronized (obj) {
while (true) {
try {
if (obj.size() == 0) {
obj.wait();
}
System.out.println(" : 。");
System.out.println(" : " + obj.size());
obj.clear();
obj.notify();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
}
/* */
class Producter implements Runnable {
private Vector obj;
public Producter(Vector v) {
this.obj = v;
}
public void run() {
synchronized (obj) {
while (true) {
try {
if (obj.size() != 0) {
obj.wait();
}
obj.add(new String(" "));
obj.notify();
System.out.println(" : 。");
Thread.sleep(500);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
}
public static void main(String[] args) {
// wait() notify()
Vector obj = new Vector();
Thread consumer = new Thread(new Consumer(obj));
Thread producter = new Thread(new Producter(obj));
consumer.start();
producter.start();
}
5.join () 방법도 라인가입이라고 한다.현재 스레드 A가 다른 스레드 B를 호출하는join () 방법입니다. 현재 스레드 A는 스레드 B가 실행될 때까지 차단 상태에서 실행 가능한 상태로 전환됩니다.
// join
class Thread11 implements Runnable{
@Override
public void run() {
System.out.println("Start Progress.");
try {
for(int i=0;i<5;i++){
System.out.println("Thread11 : "+i);
Thread.sleep(1000);
}
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("End Progress.");
}
}
public static void main(String[] args) {
// join
Thread11 t11=new Thread11();
Thread t111=new Thread(t11);
t111.start();
try {
t111.join();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("hi,I'm Main ");
}
/*
:
Start Progress.
Thread11 : 0
Thread11 : 1
Thread11 : 2
Thread11 : 3
Thread11 : 4
End Progress.
hi,I'm Main
*/
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Java 멀티스레드 스레드 동기화이 Lock 자물쇠는 현식 생성, 잠금, 방출이 필요합니다.synchronized 키워드보다 현식 Lock 자물쇠는 사용이 번거롭고 사용 시 오류가 발생할 수 있지만 더욱 강력한 기능이 있습니다.locks 패키지에는...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.