주 스레드와 하위 스레드의 동기화 제어

3431 단어 다중 스레드
면접문제가 있는데 서브스레드가 10번 순환하고 메인 스레드가 100번 순환해요. 이렇게 50번 왕복하고 메인 스레드와 서브스레드의 동기화를 통해서.
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();
			}
			
		}
	}
}

좋은 웹페이지 즐겨찾기