`
hcyoo
  • 浏览: 21326 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
社区版块
存档分类
最新评论

JAVA多线程执行的困惑

    博客分类:
  • java
阅读更多




在多线程操作中如何让数据共享,通过设置 static 的变量, 对操作该变量的方法实现同步机制
public class TradeDetail extends BaseCollect implements Runnable {
    private static String CID = "tradeDetail";//配置文件中此栏目的前缀名
    private String _dt;//日期
    private String _id;//日期的yyyyMMdd
    private String _year;//
    private String _code;//股票代码
    private String _url;//将参数据替换后的URL
    //默认构造方法
     public TradeDetail() {
         super(CID);
     }

     //构造方法2
     public TradeDetail(String dt) {
         super(CID);
         SetDt(dt);
     }

    //构造方法1
     public TradeDetail(String code,String dt) {
         super(CID);
         SetDt(dt);
         this._code = code;
     }

     public void SetDt(String dt) {
         try {
             this._dt = dt;
             this._id = dt.replaceAll("-", "");
             this._year = dt.substring(0, 4);
         } catch (Exception e) {}
     }
     public void SetCode(String code){
         this._code=code;
     }
     //将基类中的URL替换
     private void ConvertUrl() {
         _url = url.replaceAll("#code", _code).replaceAll("#id",
                 _dt.replaceAll("-", ""));
     }

     
     //插入数据方法
    public void ProcessData(){
        ConvertUrl();
        String aa = super.getHTML(_url);//获取数据
        int cc=0;
        try{
            String[] sour = aa.split("\\],\\[");
            int len;
            try {
                String stockName=sour[0].split("','")[1];
                len = sour.length;
                cc =(len-1);
            } catch (ArrayIndexOutOfBoundsException ex) {
                //不存在这支股票的分笔数据,记录日志
                return ;
            }
            StringBuffer sb = new StringBuffer();
            for (int i = 1; i < len; i++) {
                String[] k = sour[i].split("','");
                sb.append(" INSERT INTO tradeDetail_2011");
                sb.append("   VALUES("+i+",1");
                sb.append(_code+",'");
                sb.append(_dt+k[0].replaceFirst("'"," ")+"',");
                sb.append(k[1]+","+k[2]+",");
                sb.append(Integer.parseInt(k[1])*Float.parseFloat(k[2])*100+",");
                sb.append(k[5].substring(0,1)+")");
            }
            try {
                ExecSQL dao  = new ExecSQL(sb.toString());
                dao.Insert();
            } catch (SQLException ex) {
                ex.printStackTrace();
            }
        }catch(Exception ex){
            ex.printStackTrace();
        }
        addCountRows(cc);
    }


    public List<String> threadArr;
    public void run() {
        String tn = Thread.currentThread().getName();
//        System.out.println("线程:"+tn+" 开始执行");
        addTheard(tn);
        if (threadArr !=null) {
            for(int i = 0;i<threadArr.size();i++){
                SetCode(threadArr.get(i));
                ProcessData();
            }
        }
        removeThread(tn);
    }

    private static int CountRows;

    private synchronized void addCountRows(int row){
        CountRows+=row;
    }
    
    private static ArrayList<String> jsArr = null;
    private static long begDatetime = 0;
    //添加一个线程组名称
    private synchronized void addTheard(String threadName) {
        if (jsArr == null) {
            CountRows = 0;
            begDatetime = System.currentTimeMillis();
            System.out.println("开始运行多线程执行 " + Util.GETDT());//正常情况只打印一次。
            jsArr = new ArrayList<String>();
        }

        jsArr.add(threadName);
        System.out.println("添加线程名称:"+threadName+" 当前共有:"+jsArr.size()+" 线程在执行");
    }

    //移除一个线程组名称
    private synchronized void removeThread(String threadName) {
        if (jsArr == null) {
            return;
        }
        for (String d : jsArr) {
            if (d.equals(threadName)) {
                jsArr.remove(threadName);
                break;
            }
        }

        if (jsArr.size() > 0) {
            System.out.println(threadName + "线程执行完毕,还剩 " + jsArr.size() +
                               " 线程进行中。。。");
        } else {
            System.out.println("所有线程执行完毕,共用时:" + Util.StatTime(begDatetime) +
                               "   共插入 " + CountRows + " 条数据");
        }

    }

}




测试类,创建五个线程:
class testtest{
    public static void main(String[] args) {
        ExecSQL dao  = new ExecSQL("SELECT stock_code FROM stock_info WHERE  stock_name NOT LIKE '%退市%'");
       try {
           List<String> arr = dao.GetStrs();

           int a=5,j = arr.size(), s = (j + a-1) / a ;
           for (int i = 1; i <= 5; i++) {
               try {
                   TradeDetail t = new TradeDetail("2010-03-16");
                   t.threadArr = arr.subList((i - 1) * a + (i == 1 ? 0 : 1),
                                             i * a >= j ? j : i * a);
                   Thread th = new Thread(t, (i - 1) * a + "-" + i * a);
                   th.start();
               } catch (Exception e) {
                   e.printStackTrace();
                   continue;
               }
           }


       } catch (SQLException ex) {
           ex.printStackTrace();
       }


    }
}



打印出来的结果让我很困惑,为什么会打印五个"开始运行多线程执行 " ?
开始运行多线程执行 2010-3-16 13:49:20
开始运行多线程执行 2010-3-16 13:49:20
开始运行多线程执行 2010-3-16 13:49:20
开始运行多线程执行 2010-3-16 13:49:20
开始运行多线程执行 2010-3-16 13:49:20
添加线程名称:15-20 当前共有:1 线程在执行
添加线程名称:5-10 当前共有:1 线程在执行
添加线程名称:20-25 当前共有:1 线程在执行
添加线程名称:10-15 当前共有:1 线程在执行
添加线程名称:0-5 当前共有:1 线程在执行
20-25线程执行完毕,还剩 1 线程进行中。。。
10-15线程执行完毕,还剩 1 线程进行中。。。
15-20线程执行完毕,还剩 1 线程进行中。。。
5-10线程执行完毕,还剩 1 线程进行中。。。
所有线程执行完毕,共用时:0 分 5 秒 281 毫秒   共插入 7053 条数据

1
1
分享到:
评论

相关推荐

    Java线程问题代码

    从给定的文件标题“Java线程问题代码”和描述“Java线程问题代码详细解读,希望对各位有用处”,我们可以看出,这份代码是关于Java多线程编程的一个实例,旨在展示线程创建、运行以及线程间通信的一些基本概念和潜在...

    java线程入门教程,涉及线程基本知识,显浅易懂..zip

    Java线程是多任务编程的重要概念,特别是在Java这种支持并发执行的编程语言中。线程允许程序同时执行多个独立的任务,极大地...通过学习这个教程,你将能够掌握Java线程的基本操作,为后续的多线程编程打下坚实的基础。

    Java线程 详解

    - **死亡状态**(Dead/Terminated):线程执行结束或者因异常退出。 #### 四、线程同步与通信 **1. 线程同步** 由于线程共享同一进程的资源,因此需要采取措施来防止多个线程同时访问同一资源而导致的数据不一致...

    Java编程思想让很多新手止步不前,困惑已久的问题由此解开

    线程是程序执行的独立路径,理解线程间的同步和通信机制,如synchronized关键字、wait()、notify()方法,能够帮助开发者编写高效的多线程程序,应对现代计算环境的复杂需求。 总的来说,Java编程思想虽然初学时可能...

    Java解惑.pdf

    5. **多线程**:Java提供了对多线程的支持,可以使用Thread类或者实现Runnable接口来创建线程。线程同步和互斥的概念,如synchronized关键字和wait/notify机制,是多线程编程中的重要知识点。 6. **输入输出流**:...

    IBM公司Java培训pdf

    - **多线程**:Java内置了对多线程的支持,允许开发者编写能够利用多核处理器优势的应用程序。 #### 二、Java 2平台的版本划分 Java 2平台根据不同的应用场景分为三个主要版本: - **J2SE(Java 2 Platform ...

    Java学习利器-JAVA解惑

    5. **多线程编程**:Java提供了强大的多线程支持,但并发编程也意味着更多的挑战,如死锁、竞态条件、线程安全等问题。文档可能详细讲解了线程的创建、同步、通信等技术。 6. **集合框架**:Java集合框架是开发者...

    JAVA 解惑 java经典

    6. **多线程**:Java提供了丰富的API支持多线程编程,如Thread类、Runnable接口,以及synchronized关键字、volatile关键字等,理解并发编程的概念和实践方法对于开发高效程序至关重要。 7. **IO流**:Java的IO流...

    最新版的Java-解惑

    这本书深入浅出地解析了Java编程中的常见困惑,涵盖了语言基础、类库应用、多线程、网络编程、异常处理、内存管理等多个重要领域。以下是基于该书主题的一些关键知识点: 1. **Java基础**:Java语言的基础语法是...

    Java解惑(中文版)_java_java解惑_solve65p_

    9. **多线程**:学习如何创建和管理线程,理解同步和异步的概念,以及synchronized关键字的使用。 10. **Java API**:熟悉Java标准库中的各种类和接口,如Math类、Date类、String类等。 11. **Swing和AWT**:初步...

    java基础教程(java SE)

    首先理解基础概念,然后逐步深入到更复杂的主题,如集合框架、多线程和网络编程。同时,实践编程练习和项目将加深理解和巩固所学知识。这个教程附带的学习顺序指南将为你提供清晰的路径,帮助你避免自学过程中的困惑...

    Java解惑 中文版

    3. **多线程编程**:Java提供了丰富的多线程支持。读者将学习到线程同步、并发工具类的使用,以及如何避免常见的并发问题。 4. **集合框架**:Java集合框架是存储和操作数据的关键。书中的内容将涵盖List、Set、Map...

    Javapuzzler+JAVA解惑 中英双语 完整源代码

    这些谜题覆盖了类加载、内存模型、类型转换、异常处理、多线程等众多主题,旨在帮助开发者避开常见的编程误区,提升代码质量。在提供的`Javapuzzler.chm`文件中,你可以找到这些谜题的详细解释和解决方案,这对于...

    java解惑(罗列了95个容易让你迷惑的java知识点)

    3. **多线程**:Java提供了Thread类和Runnable接口来实现多线程,线程同步和互斥通过synchronized关键字、wait()、notify()和notifyAll()方法来控制。 4. **异常处理**:Java使用try-catch-finally结构处理异常,...

    Java经典源码实例

    这些源码实例覆盖了Java的基础语法、数据结构、控制结构、面向对象特性、异常处理、输入输出、多线程、网络编程等多个关键领域。通过分析和运行这些实例,你可以更深入地理解以下知识点: 1. **基础语法**:包括...

    java解惑 java 表达式谜题 java 字符谜题 java 循环谜题 java 异常谜题

    Java的高级特性如多线程、反射、泛型和注解等,常常构成更复杂的谜题。多线程涉及到同步、并发和线程安全问题;反射允许运行时动态访问类的信息和方法;泛型提供了类型安全的容器,防止了类型转换错误;注解则提供了...

    2021最新java入门教程下载借鉴.pdf

    - **多线程**:Java内置支持多线程,允许程序同时执行多个任务,这对于服务器端编程特别有用。 - **可移植性**:Java的规范确保了代码的跨平台兼容性,使得应用程序能在不同操作系统上运行。 - **Applets和...

    Java解惑(中文).pdf

    2. **多线程**:Java提供了丰富的多线程支持,包括Thread类、Runnable接口、ExecutorService等。书中将探讨并发编程的挑战,如线程同步、死锁、活锁等问题,以及如何使用synchronized、volatile关键字来确保线程安全...

    JAVA-FAQ.rar_The Java FAQ_java编程

    6. **多线程**:Java提供了内置的多线程支持,理解线程同步、并发控制(如synchronized关键字、volatile变量)和死锁是进阶技能。 7. **反射机制**:反射允许在运行时检查和操作类、接口、字段和方法,是动态编程的...

    Java程序语言设计 课后答案

    这里的“Java程序语言设计 课后答案”包含了该书基础篇的全部习题解答,对于学习者而言,是检验自我学习成果和解决困惑的宝贵资源。 首先,我们来讨论Java的基础知识。Java是一种面向对象的编程语言,它的核心理念...

Global site tag (gtag.js) - Google Analytics