java之哪种是杀死线程的最简洁和/或最有效的方法

落叶无声 阅读:15 2024-02-27 23:08:18 评论:0

我有一个在线程中连续执行的任务 x,它只会在 boolean 值将其状态更改为 true 时停止。我已经阅读了一些资料,在终止下面代码中的线程时,我采用了 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(); 
    } 
} 

请您参考如下方法:

推荐的方法是使用线程的中断标志来指示线程循环终止。没有理由使用 两个 标志(stopped 和 interrupted 标志)一个就可以,而且您似乎没有将 interrupted 标志用于其他任何事情。

请参阅 Java 教程主题 Interrupts以获得更广泛的讨论和示例。


标签:java
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号