주 스레드와 하위 스레드의 동기화 제어
3431 단어 다중 스레드
public class Test
{
public static void main(String args[])
{
// 10 , 100 50
new Thread( new Runnable(){
@Override
public void run() {
for(int i=0;i<50;i++)
{
synchronized(Test.class)
{
for(int j=0;j<10;j++)
{
System.out.println("sub thread "+i+" loop of "+j);
}
}
}
}
}).start();
for(int i=0;i<50;i++)
{
synchronized(Test.class)
{
for(int j=0;j<10;j++)
{
System.out.println("main thread "+i+" loop of " +j);
}
}
}
}
}
synchronized 바이트 코드를 통해 동기화가 필요한 내용을 잠그는 것은 간단하고 거칠어 보입니다. 이렇게 하면 자선이 순환하는 내부에서 10번 끊기지 않고 주선 내부에서 10번 순환해도 자선이 끊기지 않습니다.
두 번째 방식은 주 라인과 하위 라인의 방법을 하나의 클래스에 쓰면 같은 대상을 잠글 수 있다.synchronized 불러오는 방법은 앞에서 이 대상을 잠그는 것을 나타낸다. 이런 방식은 세립도 제어 라인을 더욱 쉽게 제어할 수 있다.
public class Test
{
public static void main(String args[])
{
final Business business=new Test().new Business();
// 10 , 100 50
new Thread( new Runnable(){
@Override
public void run() {
for(int i=0;i<50;i++)
{
business.sub(i);
}
}
}).start();
for(int i=0;i<50;i++)
{
business.main(i);
}
}
class Business
{
public synchronized void sub(int i)
{
for(int j=0;j<10;j++)
{
System.out.println("sub thread "+j+" loop of "+i);
}
}
public synchronized void main(int i)
{
for(int j=0;j<10;j++)
{
System.out.println("main thread "+j+" loop of " +i);
}
}
}
}
다음은 계속해서 위에서 상호 배척을 실현했을 뿐 통신을 하지 않았습니다. 서브라인과 메인 라인을 번갈아 실행했습니다. 다음에 우리는 bool 변수를 설정하고 대상을 통과하는this를 통과했습니다.wait와this.루틴의 동기화를 제어하기 위해 notifyAll
package uses;
import java.util.Timer;
import java.util.TimerTask;
import org.python.modules.synchronize;
import org.python.util.PythonInterpreter;
public class Test
{
public static void main(String args[])
{
final Business business=new Test().new Business();
// 10 , 100 50
new Thread( new Runnable(){
@Override
public void run() {
for(int i=0;i<50;i++)
{
business.sub(i);
}
}
}).start();
for(int i=0;i<50;i++)
{
business.main(i);
}
}
class Business
{
private boolean bShouldSub=true;
public synchronized void sub(int i)
{
if(bShouldSub)
{
// true
for(int j=0;j<10;j++)
{
System.out.println("sub thread "+j+" loop of "+i);
}
// bShouldSub false
bShouldSub=false;
// this
this.notifyAll();
}
else{
// false ,
try {
this.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public synchronized void main(int i)
{
if(bShouldSub)
{
//
try {
this.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
else
{
for(int j=0;j<10;j++)
{
System.out.println("main thread "+j+" loop of " +i);
}
// true
bShouldSub=true;
//
this.notifyAll();
}
}
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Java 다중 스레드를 순차적으로 실행하는 몇 가지 방법 요약Java 다중 스레드를 순차적으로 실행하는 몇 가지 방법 요약 동료는 무심결에 이 문제를 제기하고 두 가지 방법을 직접 실천했다.물론 더 좋은 방법이 있을 거야. 방법 1 이런 방법은 비교적 흔히 볼 수 있는 해결 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.