부울이 상태를 true로 변경할 때만 계속 스레드에서 실행되는 작업 x가 있습니다. 나는 약간의 독서를했으며, 아래의 코드에있는 쓰레드를 죽일 때 접근하는 3 가지 방법이 있습니다. 3 가지 방법 중 어느 것이 효과적입니까? 그리고 그들 중 누구도 효과적이지 않거나 정확하지 않다면 참조하기 위해 어떤 코드로 적절한 접근법을 제안하십시오.스레드를 죽이는 데 가장 능숙하고 가장 효과적인 방법은 무엇입니까
public class MyTest {
private static class transaction {
private String param1,param2,param3, param4, param5;
public transaction (String param1,String param2,String param3,String param4,String param5){
this.param1=param1;
this.param2=param2;
this.param3=param3;
this.param4=param4;
this.param5=param5;
}
public String getParam1(){
return this.param1;
}
public String getParam2(){
return this.param2;
}
public String getParam3(){
return this.param3;
}
public String getParam4(){
return this.param4;
}
public String getParam5(){
return this.param5;
}
}
public static void processBatch(String workerName){
try{
java.util.List <transaction> transactions= new java.util.LinkedList<transaction>();
java.sql.ResultSet dbtrx=Database.db.execQuery((Object)"dbname.procname");
while(dbtrx.next()){// Takes a snapshot of the pending payments in the table and stores it into the list.
Object obj=new transaction (dbtrx.getString("col1"), dbtrx.getString("col2"), dbtrx.getString("col3"), dbtrx.getString("col4"), dbtrx.getString("col5"));
transactions.add((transaction)obj);
obj=null;
}
java.util.Iterator<transaction> iterate= transactions.iterator();
/* Processes the pending batch payments*/
while(iterate.hasNext()){
transaction trx=iterate.next();
/*Calls posting function here*/
System.out.println(workerName+":- Param1 : "+trx.getParam1()+" - Param2 : " +trx.getParam2()+
" - Param3 : "+ trx.getParam3()+" - Param4 : "+ trx.getParam4()+" - Param5 : "+ trx.getParam5());
iterate.remove();
}
/*cleaning object references*/
dbtrx=null;
transactions=null;
iterate=null;
}catch(Exception e){
e.printStackTrace();
}
}
public static void main(String [] args) throws InterruptedException{
volatile boolean stop=false;
Object hold= new Object();
new Thread("Batch Worker A"){
@Override
public void run(){
while(true){
if(stop!=true){
processBatch(Thread.currentThread().getName());
}else{
try{
Thread.sleep(0);
Thread.currentThread().interrupt();
}catch(java.lang.InterruptedException e){
Thread.currentThread().interrupt();
break;
}
}
}
}}.start();
new Thread("Batch Worker B"){
@Override
public void run(){
try{
while(stop!=true){
processBatch(Thread.currentThread().getName());
}
Thread.sleep(0);
Thread.currentThread().interrupt();
}catch(java.lang.InterruptedException e){
Thread.currentThread().interrupt();
}
}}.start();
new Thread("Batch Worker C"){
@Override
public void run(){
while(!Thread.currentThread().isInterrupted()){
if(stop!=true){
processBatch(Thread.currentThread().getName());
}else{
Thread.currentThread().interrupt();
}
}
}}.start();
}
}
}
정말 가장 좋은 방법은 스레드가 무엇을하고 무엇을하고 싶은지를 먼저 코딩하는 것입니다. 그렇게하면 방해하거나 죽일 필요가 없습니다. 자문해야 할 질문은 이것입니다. 왜 내가이 스레드를 코딩하여 내가 원하지 않는 작업을 수행 했습니까? –
어쩌면 내가 문제를 제대로 이해하지 못했을 수도 있습니다. 게시 한 예는 임의의 작업 또는 작업입니다. 내 주요 관심사는 여기에 종료 호출이있는 응용 프로그램이있는 경우 메모리 누수를 피하기 위해 모든 스레드를 깔끔하게 종료하고 싶습니다. 그래서 기본적으로 스레드 종료에 접근하는 가장 좋은 방법을 찾아 내려고했습니다. – kimathie
이해합니다. 유용한 작업이 없을 때 스레드를 종료하도록 코드를 작성하는 것이 좋습니다. 문제는 수행하고 싶지 않은 작업을 수행하도록 코드를 코딩했기 때문입니다. 해결 방법은 해당 스레드에서 코드를 수정하여 수행 할 유용한 작업이 없으면 수행 한 작업 만 수행하고 종료 할 수 있도록하는 것입니다. 인터럽트 또는 종료하도록 "강제"하기 위해 스레드에 "도달"해야한다는 사실은 처음에 잘못 프로그래밍 된 것을 보여줍니다. 실은 전쟁이 아닌 협력해야합니다. –