如何在插入数据库的过程中同时启动和睡眠多个线程

时间:2016-07-21 04:23:41

标签: java multithreading

我想重复同时执行4个线程并同时睡眠。但问题是,在获得少数正确的序列数据后,很少有数据显示不同的时间。我得到了以下输出

      dtime                       data
21-MAY-16 09.38.31.031000 AM    .2652487
21-MAY-16 09.38.31.031000 AM    .21100356
21-MAY-16 09.38.31.031000 AM    .39925393
21-MAY-16 09.38.31.031000 AM    .32884327
21-MAY-16 09.38.33.046000 AM    .08516244
21-MAY-16 09.38.33.046000 AM    .701089
21-MAY-16 09.38.33.046000 AM    .9537386
21-MAY-16 09.38.33.086000 AM    .0397367   

以下是摘录:

public class TestConnection {

    public static void main(String[] args) {
        Thread t1=new Thread(new TestingThread(),"t1");
        Thread t4=new Thread(new TestingThread(),"t4");

        t1.start();
        t4.start();

    }

}

public class TestingThread implements Runnable{
    @Override
    public void run(){

            try{

                doDB();
                }
            catch(InterruptedException e){
                    System.out.println(e);
                }

    }

     private void doDB() throws InterruptedException {

         Connection conn;
         PreparedStatement pstmt;
         try
            {
                /* Create Connection objects */
                conn= ....;
                /* Create the insert statement */
                String insertQuery = ".....";

                pstmt = conn.prepareStatement(insertQuery);
                for(int i=1;i<3;i++)
                {
                    pstmt.setTimestamp(1, getCurrentTimeStamp());
                    pstmt.setFloat(2, (float) Math.random());

                    i=pstmt.executeUpdate();

                }
            try{
    if(conn!=null){
        conn.commit();
        conn.close();
        }
  }
            catch(SQLException se){
     se.printStackTrace();
  }

        }
         catch(Exception e)
         {
             e.printStackTrace();
         }

     }
}

2 个答案:

答案 0 :(得分:1)

在调用start()方法后,您无法控制这些线程。

这是负责运行这些线程的底层操作系统,大多数情况下(特别是如果核心数和&lt;同时执行的线程数)两个线程不并行运行。

因此,无法确定线程何时执行

答案 1 :(得分:1)

从java端同时运行完全的多个线程是不可能的,因为它是OS的调度责任。如果线程数大于CPU数,则必须有某种时间共享。即使线程数等于或小于CPU的数量,在我有限的知识中,仍然很难让线程在不同的CPU上同时运行。

在java视图中,您可以让一组线程处于同一状态,以CyclicBarrier为例。

有关详细信息,请参阅How to start two threads at “exactly” the same time

希望它会有所帮助。 THX