Q. 2개의 Thread 중, 한 쓰레드가 돌아가는 동안에만 다른 쓰레드가 돌아가라 구현

기본 아바타 김광호 2019. 01. 25. 조회수 387


하고싶은 것은 웹이 아닌 자바에서 Progress 진행률을 나타내고 싶습니다.

A라는 쓰레드는 ArrayList<String> 안에 있는 값을 2차원배열로 변환하는 메소드를 돌립니다.

B라는 쓰레드는 JProgressBar를 이용하여 진행률을 나타냅니다. [ JProgressBar 또는 ProgressMonitor 사용중]


ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

B쓰레드 :

class Progress extends Thread {

@Override

public void run() {

Progressbar.setValue(0);

int count = 0;

while (?) {

count++;

Progressbar.setValue(count);

try {

sleep(?);

}catch(Exception e) {

}

}

}

}


ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ


A 쓰레드 안에 메소드 :

public static String[][] getRowArray(String filename) {

int n = 0;

int k = 0;

List<String> list = getView(filename);

RowArray = new String[getRowNum(filename) + 1][getVerticalNum(filename) + 1];

if (list.size() > 1)

RowArray = aa(filename, list, n, k);

return RowArray;


}


public static String[][] aa(String filename, List<String> list, int n, int k) {

for (int i = 0; i <= getVerticalNum(filename); i++) {

if (n > OpenExcel.getRowNum(filename) || k > list.size()) {

break;

}

if (i % getVerticalNum(filename) == 0 && i != 0) {

RowArray[n][i] = list.get(k);

n++;

k++;

return aa(filename, list, n, k);

} else {

RowArray[n][i] = list.get(k);

k++;

}

}

return RowArray;

}

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ


A쓰레드에서 메소드가 진행되는 동안에만 B쓰레드를 돌리고 싶은데

B 쓰레드 안에 sleep(?) 을 맞춰주던지 count값을 바꿔줘야할것같은데.

while 조건은 제 아무리 바꿔도 count 맥스값이 되면 B쓰레드가 끝나버리더라구요

sleep(?) 을 맞춰주려 메소드가 실행될때의 시간을 구할려고 System.currentTimeMillis() 을 써볼려고 했지만

A쓰레드 안에 메소드가 돌아갈 때 B도 같이 진행을 해야하기때문에 안되구요.. 방법 좀 알려주세요..

공유하고 보상받기 ♥︎
댓글 0

2개의 답변이 있습니다.

질문자 & 큐레이터 채택
저거슨 답변자인증
BS/개발팀 2019. 01. 25 57%의 채택

전역변수로 TRUE, FALSE로

A쓰레드 시작할때 TRUE 끝날때 FALSE로 넣어주면서

B쓰레드는 계속돌고있지만 A쓰레드가 돌때만 IF문에 TRUE로 걸리면서 함수가 작동되게끔 하는 방법은 어떨까요

댓글 0
봉으니 답변자인증
시스템 2019. 01. 25 43%의 채택
public class ThreadNotifyExample {

  public static void main(String[] args) {
    DataAccessManager dataAccessManager = new DataAccessManager();
    
    ProducerThread producerThread = new ProducerThread(dataAccessManager);
    ConsumerThread consumerThread = new ConsumerThread(dataAccessManager);
    
    producerThread.start();
    consumerThread.start();
    
    try {
      Thread.sleep(2);
    } catch (InterruptedException e) {}

    producerThread.isRun = false;
    try {
      Thread.sleep(1); // consumer need time.
    } catch (InterruptedException e) {}    
    consumerThread.isRun = false;
  }
}

public class DataAccessManager {
  private String data = null;

  public synchronized void setData(String data) {
    if(this.data != null){
      try {
        wait();
      } catch (InterruptedException e) {}
    }
    this.data = data;
    System.out.println("setData() > " + data);
    notify();
  }
  
  public synchronized String getData() {
    if(this.data == null){
      try {
        wait();
      } catch (InterruptedException e) {}
    }
    String returnData = new String(this.data);
    System.out.println("getData() > " + returnData);
    this.data = null;
    notify();
    return returnData;
  }
}

public class ProducerThread extends Thread {
  public boolean isRun = true;
  private DataAccessManager dataAccessManager = null;
  
  public ProducerThread(DataAccessManager dataAccessManager){
    this.dataAccessManager = dataAccessManager;
  }

  @Override
  public void run() {
    int loopCount = 0;
    while(isRun){
      long _nanoTime = System.nanoTime();
      long _nanoSecond = _nanoTime % 1000000000;
      String nanoSecond = String.valueOf(_nanoSecond);
      String nanoSecondPad = ("000000000" + nanoSecond).substring
                                     ​(nanoSecond.length(), nanoSecond.length()+9);
      String message = "[" + loopCount + "\t] " + nanoSecondPad + " nano";
      dataAccessManager.setData(message);
      loopCount++;
    }
  }
}

public class ConsumerThread extends Thread {
  public boolean isRun = true;
  private DataAccessManager dataAccessManager = null;
  
  ConsumerThread(DataAccessManager dataAccessManager){
    this.dataAccessManager = dataAccessManager;
  }
  
  @Override
  public void run() {
    while(isRun){
      String message = dataAccessManager.getData();
    }
  }
} 

도움이 될까요?

댓글 0