<pre name="code" class="java">public class ThreadRelatedService2 {
// key point: records list must be ordered
public void exec() {
// System.out.println("Start ThreadRelatedService.exec:");
List<String> list = new ArrayList<String>();
// if there are 91000 records in the table
for (int i = 0; i < 90000; i++) {
list.add(String.valueOf(i));
}
for (int i = 0; i < 9; i++) {
// get part records from table by page
List<String> sublist = list.subList(10000 * i, 10000 * (i + 1));
subExec(sublist);
}
// System.out.println("End ThreadRelatedService.exec:");
}
private void subExec(List<String> list) {
// System.out.println("Start ThreadRelatedService.subExec:");
Thread[] threadPool = new Thread[5];
// ###############################
LinkedBlockingQueue<List<String>> queue = new LinkedBlockingQueue<List<String>>();
// ###############################
for (int i = 0; i <= 9; i++) {
// divide one page data to parts for different thread to process
List<String> sublist = list.subList(1000 * i, 1000 * (i + 1));
try {
// put method not add method
queue.put(sublist);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
// due to LinkedBlockingQueue,we can set fixed thread number
for (int i = 0; i < 5; i++) {
threadPool[i] = new Thread(new ThreadImpl(queue), "Thread" + i);
threadPool[i].start();
}
for (Thread thread : threadPool) {
try {
thread.join();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
// System.out.println("End ThreadRelatedService.subExec:");
}
private class ThreadImpl implements Runnable {
private LinkedBlockingQueue<List<String>> queue;
public ThreadImpl(LinkedBlockingQueue<List<String>> queue) {
this.queue = queue;
}
@Override
public void run() {
// System.out.println("Thread" + Thread.currentThread().getId());
// System.out.println("Start ThreadRelatedService.run:");
String result = "";
List<String> list = queue.poll();
while (list != null) {
for (String str : list) {
result += str + "_";
}
System.out.println(result);
list = queue.poll();
}
// System.out.println("End ThreadRelatedService.run:");
}
}
}
java多线程并发处理之阻塞队列LinkedBlockingQueue用法
最新推荐文章于 2024-08-16 11:20:08 发布