2011-12-09 6 views
0

자바에서 MT와 관련된 간단한 문제가 있습니다. 콘솔에 대한 액세스를 동기화하려면 woudlike. 예 : System.out에서 첫 번째 스레드 쓰기 "Number one"Thread2 printl ("Number two"). 나는 소리내어이 스레드를 버퍼링하지 않고 콘솔에서 순차적으로 numer를 쓰는 것과 동기화하고 싶다. 어떻게해야합니까?콘솔과 공유 된 스레드

Thread one 
Thread two 
Thread one 
Thread two 
... 

// 코드

package com.example; 

public class MyThread implements Runnable{ 


@Override 
synchronized public void run(){ 
    while(true){ 
     System.out.println("Thread first"); 

    } 
} 

}

//

package com.example; 

public class MyThread2 implements Runnable { 


@Override 
synchronized public void run() { 
    // TODO Auto-generated method stub 
    System.out.println(""); 

} 

} 

//

package com.example; 

import java.util.concurrent.Semaphore; 

public class Main { 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 
     // TODO Auto-generated method stub 

Thread th1= new Thread(new MyThread()); 
Thread th2= new Thread(new MyThread2()); 

th2.setPriority(Thread.MAX_PRIORITY); 
th1.start(); 
th2.start(); 
    } 

} 
+0

기존 코드에 문제가있는 경우 그 중 일부를 게시하십시오. 지금까지 뭐 해봤 어? 또한, 왜 [태그 : 숙제] 또는 일종의 학습 연습 이외에이 작업을하고 싶은지 잘 모르겠습니다. 숙제 인 경우 해당 태그를 질문에 추가하십시오. 따라서 힌트를 제공 할 수 있습니다. –

+1

순차적으로 쓰고 싶다면 쓰레드를 사용하는 이유는 무엇입니까? 이것은 단순히 관심있는 질문입니까? –

+0

대체하려면 두 개의 스레드가 필요합니까? 아니면 어떤 수의 스레드가 필요합니까?이 예제는 두 가지일까요? – corsiKa

답변

2

순차적 순서 지정 스레드가 오히려 쓸모 없으면 좋겠지 만 오히려 여기에 하나의 해결책이 있습니다. 우리는 N 개의 스레드가 있다고 가정하기 때문에 오히려 쓸모없는 질문입니다.

스레드 0

가 잘 패턴을 얻을 수 1, N + 1를 작성해야

스레드 1 숫자 0, N, 2N, 3N, ..., 2N + 1, 3N + 1을 작성해야 . 이 작업을 수행하는 방법? 간단히 말하면, 우리는 기본적으로 우리가 쓸 차례가 될 때까지 기다리는 방법이 필요합니다. 단순함을 위해 정적 객체를 사용하는 실제 간단한 솔루션입니다.

private static volatile int globalVal = 0; 
private static Object lock = new Object(); 

public void writeInt(int val) { 
    synchronized(lock) { 
     while (globalVal != val) { 
      try { 
       lock.wait(); 
      } 
      catch(InterruptedException e) { 
      } 
     } 
     System.out.println(val); 
     globalVal++; 
     lock.notifyAll(); 
    } 
} 

스레드 자체의 논리는 독자의 연습 문제로 남습니다.

0

소개 e a Queue<String>을 입력하고 String을 큐에 추가하십시오. 그런 다음 전용 스레드를 대기열에서 가져 와서 콘솔에 씁니다. 이렇게하면 스레드의 대기열 액세스를 기반으로 FIFO 순서가 작성됩니다.

대기열을 사용하지 않으려면 차단 된 스레드를 전환하는 토큰 관리자와 같은 것이 좋습니다. 참여하는 각 스레드에 대한 Exchanger<V>은 좋은 시작점입니다.

+0

이렇게하면 순차 번호가 콘솔에 쓰여지는 것을 보장하지 못합니다. 이 연습은 스레드 간 엄격한 교대 작업으로 각 인쇄 작업 사이에 다른 스레드를 기다리고 있습니다. –

+0

대기열 구현에 따라 다르지만 2 개의 스레드 인 경우 'SynchronousQueue ' –

+0

을 사용하여 수행 할 수 있습니다. 길이 1의 차단 대기열이 트릭을 수행 할 것입니다. – user949300