http://javaservice.net/~java/bbs/read.cgi?m=devtip&b=javatip&c=r_p&n=1065062151&p=1&s=t#1065062151예를 들어 고객인지 안닌지를 판별하는 함수 getCust(String aaa)가 참인지 거짓인지를 반환하는 이함수를 호출하여 응답을 기다리는데 5초안에 응답을 하지 않으면 강제로 'false'처리하는 경우...
쓰레드를 하나 만들어서 getCust() 메소드를 호출하시고
그 쓰레드의 상태를 getCust() 메소드를 랩핑한 메소드에서
getCust() 메소드의 실행 상태를 폴링하시면 될듯하네요.
해당 메소드가 빈번하게 호출된다면 좀 문제가 있는 해결책일 수도 있겠습니다.
참고만 하시길..
public class Cust {
// 폴링 딜레이...(millisecond)
private static final int POLL_DELAY = 100;
public static boolean getCust(String id, int delay) throws TimedOutException{
CustThread ct = new CustThread(id);
ct.start();
int timer = 0;
boolean returnValue = false;
while(true) {
if (ct.isReturned()) {// getCust()의 실행이 끝났으면
returnValue = ct.getReturnValue();
break;
} else {// 아직 끝나지 않았다면
try {
// 좀 쉬어주고
Thread.sleep(POLL_DELAY);
} catch(InterruptedException ie){}
timer += POLL_DELAY;
if (timer > dely) { // 타임 아웃되었는지 체크
// 주어진 시간동안 답이 없으면 Exception 발생
throw new Exception("TIME_OUT");
// return false; <-- 이렇게 하셔도
}
}
} // end of while
return returnValue;
}
static class CustThread extends Thread {
private boolean isReturned = false;
private String id;
private boolean returnValue = false;
public CustThread (String id) {
this.id = id;
}
public void run() {
/* 실제 getCust(String aaa); 를 사용
*/
AAA a = new AAA();
returnValue = a.getCust(id);
// getCust() 의 실행이 끝났으면 flag 세팅
isReturned = true;
}
public synchronized boolean isReturned() {
return isReturned;
}
pubilc synchronized boolean getReturnValue() {
return returnValue;
}
}
}
두번째 참고 할 만한 소스
===========================>
폴링하는 것보다는 조금 괜찮은 것 같은 소스입니다.
비슷한게 저도 필요해서
어제 별 생각 없이 책에 있는 거 카피해서 써볼라다가
데드락에 걸려서 고생 좀 했습니다.
약간 수정한 소스고요, 5초동안 Task 가 성공하길 기다리는 소스입니다.
조금 수정하긴 했지만 원본 소스의 아이디어에서 크게 벗어난것은 없습니다.
원본파일 첨부. 출처 : http://www.amazon.com/exec/obidos/tg/stores/detail/-/books/0672315858/customer-reviews/002-0366056-9156831?show=-rating
public class TestMain {
public static void main(String[] args){
final EarlyReturnTest er = new EarlyReturnTest();
try {
Runnable r = new Runnable() {
public void run() {
try {
er.doWork();
} catch ( Exception x ) {
x.printStackTrace();
}
}
};
//먼저 Task 를 실행한다.
Thread t = new Thread(r, "Runner");
t.setDaemon(true);
t.start();
long startTime = System.currentTimeMillis();
//5초 동안 대기할 것을 시작한다.
er.waitUntilAtLeast(5000);
long elapsedTime = System.currentTimeMillis() - startTime;
System.out.println("after " + elapsedTime +" ms, retVal=" + er.ret);
} catch ( InterruptedException ix ) {
ix.printStackTrace();
}
}
}
class EarlyReturnTest {
String ret=null;
Exception e=null;
private Object sync=new Object();
public EarlyReturnTest() {
}
//TASK 실행. 현재 while문이 무한루프를 돌며 응답을 안하게 된다
private String doProcessWork() throws Exception{
int k=0;
while(k<100){
k=k+1;
k=k-1;
}
ret="workend";
return ret;
}
//TASK 를 호출한다. TASK 가 완료될 경우 wating 하고 있는 thread 를 notify한다.
public void doWork() {
try{
ret = doProcessWork();
synchronized(sync){
sync.notify();
}
}catch(Exception e){
processException(e);
}
}
//TASK 실행중 Exception 이 발생한 경우에도 wating 하고 있는 thread 를 notify한다.
public void processException(Exception e){
this.e=e;
synchronized(sync){
sync.notify();
}
}
//정한 시간동안 waitng 한다. 혹시나 notify 되더라도 정해진 조건이 만족되지 않으면
//정한시간에서 지난 시간을 제한후 다시 wait 를 시작한다.
public void waitUntilAtLeast(long msTimeout) throws InterruptedException {
long endTime = System.currentTimeMillis() + msTimeout;
long msRemaining = msTimeout;
while ( ( ret==null ) && ( msRemaining > 0L ) && (e==null)) {
synchronized(sync){
sync.wait(msRemaining);
}
msRemaining = endTime - System.currentTimeMillis();
}
}
}
by number501(a)msn.com
--------------------------------------------------------------------------------
쓰레드를 하나 만들어서 getCust() 메소드를 호출하시고
그 쓰레드의 상태를 getCust() 메소드를 랩핑한 메소드에서
getCust() 메소드의 실행 상태를 폴링하시면 될듯하네요.
해당 메소드가 빈번하게 호출된다면 좀 문제가 있는 해결책일 수도 있겠습니다.
참고만 하시길..
public class Cust {
// 폴링 딜레이...(millisecond)
private static final int POLL_DELAY = 100;
public static boolean getCust(String id, int delay) throws TimedOutException{
CustThread ct = new CustThread(id);
ct.start();
int timer = 0;
boolean returnValue = false;
while(true) {
if (ct.isReturned()) {// getCust()의 실행이 끝났으면
returnValue = ct.getReturnValue();
break;
} else {// 아직 끝나지 않았다면
try {
// 좀 쉬어주고
Thread.sleep(POLL_DELAY);
} catch(InterruptedException ie){}
timer += POLL_DELAY;
if (timer > dely) { // 타임 아웃되었는지 체크
// 주어진 시간동안 답이 없으면 Exception 발생
throw new Exception("TIME_OUT");
// return false; <-- 이렇게 하셔도
}
}
} // end of while
return returnValue;
}
static class CustThread extends Thread {
private boolean isReturned = false;
private String id;
private boolean returnValue = false;
public CustThread (String id) {
this.id = id;
}
public void run() {
/* 실제 getCust(String aaa); 를 사용
*/
AAA a = new AAA();
returnValue = a.getCust(id);
// getCust() 의 실행이 끝났으면 flag 세팅
isReturned = true;
}
public synchronized boolean isReturned() {
return isReturned;
}
pubilc synchronized boolean getReturnValue() {
return returnValue;
}
}
}
두번째 참고 할 만한 소스
===========================>
폴링하는 것보다는 조금 괜찮은 것 같은 소스입니다.
비슷한게 저도 필요해서
어제 별 생각 없이 책에 있는 거 카피해서 써볼라다가
데드락에 걸려서 고생 좀 했습니다.
약간 수정한 소스고요, 5초동안 Task 가 성공하길 기다리는 소스입니다.
조금 수정하긴 했지만 원본 소스의 아이디어에서 크게 벗어난것은 없습니다.
원본파일 첨부. 출처 : http://www.amazon.com/exec/obidos/tg/stores/detail/-/books/0672315858/customer-reviews/002-0366056-9156831?show=-rating
public class TestMain {
public static void main(String[] args){
final EarlyReturnTest er = new EarlyReturnTest();
try {
Runnable r = new Runnable() {
public void run() {
try {
er.doWork();
} catch ( Exception x ) {
x.printStackTrace();
}
}
};
//먼저 Task 를 실행한다.
Thread t = new Thread(r, "Runner");
t.setDaemon(true);
t.start();
long startTime = System.currentTimeMillis();
//5초 동안 대기할 것을 시작한다.
er.waitUntilAtLeast(5000);
long elapsedTime = System.currentTimeMillis() - startTime;
System.out.println("after " + elapsedTime +" ms, retVal=" + er.ret);
} catch ( InterruptedException ix ) {
ix.printStackTrace();
}
}
}
class EarlyReturnTest {
String ret=null;
Exception e=null;
private Object sync=new Object();
public EarlyReturnTest() {
}
//TASK 실행. 현재 while문이 무한루프를 돌며 응답을 안하게 된다
private String doProcessWork() throws Exception{
int k=0;
while(k<100){
k=k+1;
k=k-1;
}
ret="workend";
return ret;
}
//TASK 를 호출한다. TASK 가 완료될 경우 wating 하고 있는 thread 를 notify한다.
public void doWork() {
try{
ret = doProcessWork();
synchronized(sync){
sync.notify();
}
}catch(Exception e){
processException(e);
}
}
//TASK 실행중 Exception 이 발생한 경우에도 wating 하고 있는 thread 를 notify한다.
public void processException(Exception e){
this.e=e;
synchronized(sync){
sync.notify();
}
}
//정한 시간동안 waitng 한다. 혹시나 notify 되더라도 정해진 조건이 만족되지 않으면
//정한시간에서 지난 시간을 제한후 다시 wait 를 시작한다.
public void waitUntilAtLeast(long msTimeout) throws InterruptedException {
long endTime = System.currentTimeMillis() + msTimeout;
long msRemaining = msTimeout;
while ( ( ret==null ) && ( msRemaining > 0L ) && (e==null)) {
synchronized(sync){
sync.wait(msRemaining);
}
msRemaining = endTime - System.currentTimeMillis();
}
}
}
by number501(a)msn.com
--------------------------------------------------------------------------------
댓글 0
번호 | 제목 | 글쓴이 | 날짜 | 조회 수 |
---|---|---|---|---|
18 | Applet 에서 JavaScript 를 호출 | 박상현 | 2003.10.13 | 2414 |
17 | 색상표 | 박상현 | 2003.10.10 | 1771 |
16 | [javascript]textarea의 내용을 클립보드에 담아 처리하기 | 박상현 | 2003.10.09 | 3679 |
15 | [제로보드] 일반페이지 인증하기 | 박상현 | 2003.10.09 | 1967 |
» | 시간안에 응답하지 않는함수는 에러(혹은 exception)처리 | 박상현 | 2003.10.08 | 2046 |
13 | 자바스크립트사용시 주의점 | 운영자 | 2003.10.06 | 1899 |
12 | excel로 자료 출력 | 운영자 | 2003.10.06 | 2387 |
11 | batch 작업 | 박상현 | 2002.02.13 | 2020 |
10 | 수정된 StringTokenizer | 박상현 | 2001.12.17 | 2579 |
9 | java에서 system의 property확인 jsp파일 | 박상현 | 2001.10.27 | 2358 |
8 | 프리페어스테이트먼트에 ? 표 자리에 값을 셋팅후 만들어진 SQL 문을 보는 유틸 | 운영자 | 2003.09.18 | 3391 |
7 | RAS암호 시스템의 구현 | 박상현 | 2001.10.16 | 3232 |
6 | JCE정보 보는 소스 | 박상현 | 2001.10.16 | 2399 |
5 | 테두리및 가로줄, 세로줄이 1px인 테이블 만들기 | 운영자 | 2003.10.01 | 2531 |
4 | table 외곽에 테두리만 1pixel로 만들기 | 운영자 | 2003.10.01 | 2249 |
3 | BB설명 | 운영자 | 2003.09.26 | 2159 |
2 | 창닫기 전에 물어보기 | 운영자 | 2003.09.26 | 2574 |
1 | popup창 띄우는 4가지 방법 | 운영자 | 2003.09.24 | 4004 |