java

2016-04-13 5 views
0

'da işlemek için her bir iş parçacığına belirli sayıda rdms kaydı atama Burada iki iş parçacığı oluşturdum. Bir toplu iş dosyasındaki mysql'den kayıtları okumaya ve bu iş parçacığını her bir iş parçacığına atamaya çalışıyorum bu kayıtlar konsola.java

Her birinde 10 kayıt içeren iki grup olduğunu varsayalım. Bu kayıtları konsolda yazmak için her bir iş parçacığına her bir iş parçacığı atamaya çalışıyorum.

Burada sadece thread1 tüm 1000 kaydı okuyor (yığın başına 10 kayıt) .But thread2 oluşturmaya çalışacağım.İleri şekilde işleme koyabilmek için thread2 oluşturabilirim.

Kodum:

public class DataRead { 

    static final String JDBC_DRIVER = "com.mysql.jdbc.Driver"; 
    static final String DB_URL = "jdbc:mysql://localhost/test"; 

    static final String USER ="root"; 
    static final String PASS ="abc"; 

    public static void main(String[] args) throws ClassNotFoundException, SQLException { 
     Connection conn = null; 
     Statement stmt = null; 

     Class.forName(JDBC_DRIVER); 

     System.out.println("Connecting to a selected database"); 
     conn = DriverManager.getConnection(DB_URL, USER,PASS); 
     System.out.println("Connected to Database Successfully !!!"); 

     ResultSet rs = null; 

     stmt = conn.createStatement(); 
     int maxRecords = 10; 
     int initialcount =0; 
     int count =0; 
     rs = stmt.executeQuery("SELECT COUNT(*) FROM customer"); 
     rs.next(); 
     count = rs.getInt(1); 
     System.out.println(count); 

     for(int i=0;i<count/10;i++){ 

       String sql =" SELECT customerId,firstName,lastName FROM customer ORDER BY customerId LIMIT "+initialcount+","+maxRecords; 

       rs = stmt.executeQuery(sql); 

       String CustID= null; 
       String firstName = null; 
       String lastName = null; 


       ExecutorService threadExecutor = Executors.newFixedThreadPool(2); 
       List<CustomerData> list = new ArrayList<CustomerData>(); 

       while(rs.next()){ 

        CustomerData customer = new CustomerData(); 
        customer.setCustID(rs.getString("customerId")); 
        customer.setFirstName(rs.getString("firstName")); 
        customer.setLastName(rs.getString("lastName")); 

        list.add(customer); 

       } 
       MyRunnable task1 = new MyRunnable(list); 
        threadExecutor.execute(task1); 


       threadExecutor.shutdown(); 
       while(!threadExecutor.isTerminated()){ 
        try { 
         threadExecutor.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS); 
         } catch (InterruptedException e) { 

         } 
       } 

       initialcount = initialcount + maxRecords; 
     } 

    System.out.println("Finished all threads !!!"); 
    } 

} 

MyRunnable:

public class MyRunnable implements Runnable{ 

    private final List list; 

    public MyRunnable(List list){ 
     this.list = list; 
    } 

    @Override 
    public void run() { 
     for(int i=0;i<list.size();i++){ 
      CustomerData cust = (CustomerData) list.get(i); 
      System.out.println(Thread.currentThread().getName()+" "+"Hello: "+cust.getCustID()+" "+cust.getFirstName()+" "+cust.getLastName()); 
     } 


    } 

} 

CustomerData:

public class CustomerData { 

     private String custID; 
     private String firstName; 
     private String lastName; 

    public String getCustID() { 
     return custID; 
    } 
    public void setCustID(String custID) { 
     this.custID = custID; 
    } 
    public String getFirstName() { 
     return firstName; 
    } 
    public void setFirstName(String firstName) { 
     this.firstName = firstName; 
    } 
    public String getLastName() { 
     return lastName; 
    } 
    public void setLastName(String lastName) { 
     this.lastName = lastName; 
    } 
} 

cevap

1

i sık sık takip ederdi Bir hızlı çözüm,

içVar. Enqueue toplu işleyin. Foreach iş parçacığı değeri (iç sıradan toplu iş) dequeue ve atayın.

DEĞİL TAM BİR ÇÖZÜM

Adım1:

Queue<List<CustomerData>> queue = new ConcurrentLinkedQueue<ArrayList<CustomerData>>(); 

Adım 2: foreach Seçili öğe nesnelerin toplu (10 diyelim) oluşturmak

ArrayList<CustomerData> listofobjects = // insert batch of vales selected from DB 

step3:

queue.add(listofobjects); // add your batches into concurrent queue 

Adım4:

while(queue.isEmpty()){ 
    ArrayList<CustomerData> batch = queue.poll(); 
    // Pass batch to Thread and print it. 
} 
+0

u burada – dev777

+0

dev777 @ üzerinde kodunu düzenlemek misiniz, İşte basit sözde olduğunu. Bir deneyin – Backtrack

+0

Teşekkür ederim. Onunla deneyeceğim – dev777