아핫뉴스실시간 인기검색어
아핫뉴스 화산 이미지
아하

생활

생활꿀팁

기민한진도개272
기민한진도개272

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

하고싶은 것은 웹이 아닌 자바에서 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도 같이 진행을 해야하기때문에 안되구요.. 방법 좀 알려주세요..

    55글자 더 채워주세요.
    2개의 답변이 있어요!
    • 수줍은이구아나17
      수줍은이구아나17

      전역변수로 TRUE, FALSE로

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

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

    • 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(); } } }

      도움이 될까요?