다선정으로 창구 매표 문제를 해결하다

번개를 사용한 적이 있는 사람은 번개의 속도가 일반 다운로드기보다 빠르다는 것을 발견할 수 있다.그것은 단독으로 사용하는 인터넷 채널이 있습니까?물론 아니다. 번개가 여러 라인을 열어 다운로드 속도를 높였기 때문이다.
프로세스란?
프로세스가 실행 중인 프로그램입니다.QQ를 켜는 것은 하나의 프로세스를 켜는 것이다. 하나의 프로세스가 메모리에 들어가서 실행되면 하나의 프로세스가 된다.프로세스는 실행 중인 프로그램입니다.
스레드란?
루틴은 프로세스의 실행 단원으로 하나의 프로세스에 여러 개의 루틴이 있을 수 있다.360안전위사는 바이러스 검사를 시작하는 동시에 쓰레기 청소도 할 수 있습니다. 한 프로그램에서 여러 개의 퀘스트를 열 수 있습니다. 즉, 여러 개의 라인을 열 수 있는 표현입니다.
이전에 우리의 CPU는 단핵이어서, 라인을 동시에 진행할 수 없고, 단지 하나의 라인만 운행할 수 있었다.모든 스레드는 CPU 사용권을 번갈아 사용하며, 스레드마다 CPU 시간을 평균적으로 분배합니다.각 프로세스 간에 CPU가 높이 전환됩니다.이제 CPU에는 2코어 쿼드 코어가 있으므로 여러 스레드가 동시에 진행될 수 있습니다.그래서 우리가 휴대전화나 컴퓨터를 다시 볼 때 우리는 종종 몇 개의 핵인지 주목하고 다핵의 운행 속도가 비교적 빠르다.
스레드를 만드는 목적:
프로그램이 단독으로 실행되는 경로를 구축하여 여러 부분의 코드를 동시에 실행하도록 하기 위해서다.즉, 라인을 만들고 실행하려면 라인을 정해야 하는 작업을 수행해야 한다.
다중 스레드 정의 방법:
1. 클래스를 정의하여 Runnable 인터페이스를 실현한다.2. 인터페이스의run 방법을 덮어씁니다.3. Thread 클래스를 만드는 대상 4. Runnable 인터페이스의 하위 클래스 대상을 매개 변수로 Thread 클래스에 전달하는 구조 함수.5, Thread 클래스의 start 방법을 호출하여 스레드를 시작합니다.
이런 방식으로 라인을 실현하는 것이 비교적 좋고 또 하나는 Thread류를 계승하는 것이다
1 클래스 상속 Thread를 정의합니다.2 런을 다시 쓰는 방법.3 하위 클래스 대상을 만드는 것이 바로 루트 대상을 만드는 것이다.4 start 방법을 호출하고 라인을 열고 라인을 실행하며 jvm에run 방법을 호출하는 것을 알려줍니다.
수요: 영화관의 매표, 우리는 다선정으로 영화관의 매표 과정을 모의한다.가령 두 개의 창구가 티켓 판매 중 번호가 01-100이고 창구 1과 창구 2가 티켓을 팔고 있다고 가정하면 이번 영화의 좌석은 모두 100개(이 영화는 100장만 판매할 수 있다) 번호는 01-100이다. 현재 실현: 1, 두 개의 창구가 티켓을 판매한다.두 창구에서 각각 몇 장의 표를 팔았는지, 각자 파는 표의 번호를 계산한다.두 창구가 번갈아 표를 파는 것을 실현하다
   
public static void main(String[] args) {
		// 100      01-100
		List li=new ArrayList();
		for (int i = 1; i <=100; i++) {
			if(i<10){
				String s="0"+i;
				li.add(s);
			}else{
			li.add(i+"");
			}
		}
		// tickets t=new tickets();
	    //    Thread   ,  Runnable     
	        tickets t=new tickets(li);                     //3.       
	  		Thread t0 = new Thread(t,"   ");    //4.  Thread    ,  runnable       
	  		Thread t1=new Thread(t,"   ");
	  		t0.start();
	  		t1.start();
		
	}
public class tickets implements Runnable {             //         :1  Runnable  
	private List li; //           01-100
	private int ticket = 100; //     

	//             
	public tickets(List li) {
		this.li = li;
	}

	public tickets() {
		super();
	}//      

	@Override
	public void run() {                           //2.  run  
		 List ticketNum =new ArrayList();
		int count = 0; //             
		while (true) { //
			synchronized (this) { //                 
				if (ticket<=0) {
					System.out.println(Thread.currentThread().getName() + "  " + count + " ,     :"+ticketNum);
					return;
				}
				count++;
				ticket--;
				//---------------
				Random ra=new Random();
				int num = ra.nextInt(li.size()); //  0-100    ,    
				ticketNum.add(li.get(num));  //                       
				li.remove(num);  //             ,         ,       
                       //        
				if(flag){
				   flag=true;
				   this.notify();//         
			     try {this.wait();} //       
			           catch (InterruptedException e) {	e.printStackTrace();}
			   }else{
				   flag=false;
				   this.notify(); //        
				   try {this.wait();} //     
				       catch (InterruptedException e) {e.printStackTrace();} 
			   }	
			}
		}

	}

총괄: 사실 생활 속의 많은 장면들이 다선정까지 운행할 수 있다. 12306 기차가 표를 살 때 우리는 인터넷에서 표를 살 수도 있고 창구에서 표를 살 수도 있다.노정은 안전하지 않지만 속도가 빠르다.우리는 동기화 코드 블록의 잠금 메커니즘을 추가한 후 안전성을 확보했지만 속도를 낮추는 것은 불가피하다.자바에는 우리가 사용할 때 안전하지 않은 종류가 많지만 속도가 빠르다.바로 우리가 속도에 대한 고려 때문이다.

좋은 웹페이지 즐겨찾기