java 线程池 并行 执行
https://github.com/donaldlee2008/JerryMultiThread/blob/master/src/com/jerry/threadpool/ThreadPoolTest.java
https://github.com/donaldlee2008/JerryMultiThread/tree/master/src/com/jerry/threadpool
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Random;
import java.util.concurrent.Callable;
public class ThreadPoolTest {
public static void main(String[] args) throws InterruptedException {
		ThreadPool threadPool = new ThreadPool(10); //创建一个有个3工作线程的线程池
		Thread.sleep(500); //休眠500毫秒,以便让线程池中的工作线程全部运行
		//运行任务
		for (int i = 0; i <=5 ; i++) { //创建6个任务
		//	threadPool.execute(createTask(i));
		}
// ArrayList<Callable> clist =new ArrayList<Callable>();
         for(int i=0;i<100;i++){
         	ArrayList<Integer> list =new ArrayList<Integer>();
         	int  k=getrandom(1000000,100000);
         	for(int x=0;x<k ;x++){
         		list.add(getrandom(1000000,0));
         	}
         	threadPool.execute(createTask2(list,i)); 
         	// clist.add(c3);
}
		threadPool.waitFinish(); //等待所有任务执行完毕
		threadPool.closePool(); //关闭线程池
}
	public static int getrandom(int max,int min) {
        // int max=20;
         //int min=10;
         Random random = new Random();
         int s = random.nextInt(max)%(max-min+1) + min;
        // System.out.println(s);.
         return s;
     }
private static Runnable createTask(final int taskID) {
		return new Runnable() {
			public void run() {
			//	System.out.println("Task" + taskID + "开始");
				System.out.println("Hello world");
			//	System.out.println("Task" + taskID + "结束");
			}
		};
	}
	private static Runnable createTask2(ArrayList<Integer> list,final int taskID) {
		return new Runnable() {
			public void run() {
			//	System.out.println("Task" + taskID + "开始");
				//System.out.println("Hello world");
				Collections.sort(list, new Comparator<Integer>() {
@Override
		        public int compare(Integer o1, Integer o2) {
		            if (o1< o2)
		                return -1;
		            else if (o1 > o2)
		                return 1;
		            else
		                return o1.compareTo(o2);
		        }
		    });
				System.out.println("Task" + taskID + "结束"+list.size());
			}
		};
	}
//	Collections.sort(list, new Comparator<Integer>() {
//   	 
//        @Override
//        public int compare(Integer o1, Integer o2) {
//            if (o1< o2)
//                return -1;
//            else if (o1 > o2)
//                return 1;
//            else
//                return o1.compareTo(o2);
//        }
//    });
}
import java.util.LinkedList;
/**
 * Java线程池工具类
 * @author Jerry Wang
 *
 */
public class ThreadPool extends ThreadGroup {
	private boolean isClosed = false;  //线程池是否关闭 
	private LinkedList<Runnable> workQueue;      //工作队列
	private static int threadPoolID = 1;  //线程池的id
	public ThreadPool(int poolSize) {  //poolSize 表示线程池中的工作线程的数量
super(threadPoolID + "");      //指定ThreadGroup的名称
		setDaemon(true);               //继承到的方法,设置是否守护线程池
		workQueue = new LinkedList<Runnable>();  //创建工作队列
		for(int i = 0; i < poolSize; i++) {
			new WorkThread(i).start();   //创建并启动工作线程,线程池数量是多少就创建多少个工作线程
		}
	}
/** 向工作队列中加入一个新任务,由工作线程去执行该任务*/
	public synchronized void execute(Runnable task) {
		if(isClosed) {
			throw new IllegalStateException();
		}
		if(task != null) {
			workQueue.add(task);//向队列中加入一个任务
			notify(); 			//唤醒一个正在getTask()方法中待任务的工作线程
		}
	}
/** 从工作队列中取出一个任务,工作线程会调用此方法*/
	private synchronized Runnable getTask(int threadid) throws InterruptedException {
		while(workQueue.size() == 0) {
			if(isClosed) return null;
			System.out.println("工作线程"+threadid+"等待任务...");
			wait();				//如果工作队列中没有任务,就等待任务
		}
		System.out.println("工作线程"+threadid+"开始执行任务...");
		return (Runnable) workQueue.removeFirst(); //反回队列中第一个元素,并从队列中删除
	}
/** 关闭线程池 */
	public synchronized void closePool() {
		if(! isClosed) {
			waitFinish();        //等待工作线程执行完毕
			isClosed = true;
			workQueue.clear();  //清空工作队列
			interrupt(); 		//中断线程池中的所有的工作线程,此方法继承自ThreadGroup类
		}
	}
/** 等待工作线程把所有任务执行完毕*/
	public void waitFinish() {
		synchronized (this) {
			isClosed = true;
			notifyAll();			//唤醒所有还在getTask()方法中等待任务的工作线程
		}
		Thread[] threads = new Thread[activeCount()]; //activeCount() 返回该线程组中活动线程的估计值。
		int count = enumerate(threads); //enumerate()方法继承自ThreadGroup类,根据活动线程的估计值获得线程组中当前所有活动的工作线程
		for(int i =0; i < count; i++) { //等待所有工作线程结束
			try {
				threads[i].join();	//等待工作线程结束
			}catch(InterruptedException ex) {
				ex.printStackTrace();
			}
		}
	}
/**
	 * 内部类,工作线程,负责从工作队列中取出任务,并执行
	 * @author sunnylocus
	 */
	private class WorkThread extends Thread {
		private int id;
		public WorkThread(int id) {
			//父类构造方法,将线程加入到当前ThreadPool线程组中
			super(ThreadPool.this,id+"");
			this.id =id;
		}
@Override
		public void run() {
			while(! isInterrupted()) {  //isInterrupted()方法继承自Thread类,判断线程是否被中断
				Runnable task = null;
				try {
					task = getTask(id);		//取出任务
				}catch(InterruptedException ex) {
					ex.printStackTrace();
				}
				//如果getTask()返回null或者线程执行getTask()时被中断,则结束此线程
				if(task == null) return;
try {
					task.run();  //运行任务
				}catch(Throwable t) {
					t.printStackTrace();
				}
			}//  end while
		}//  end run
	}// end workThread
}
java 线程池 并行 执行的更多相关文章
- 解决Java线程池任务执行完毕后线程回收问题
		
转载请注明出处:http://www.cnblogs.com/pengineer/p/5011965.html 对于经常使用第三方框架进行web开发的程序员来说,Java线程池理所 ...
 - Netty核心概念(7)之Java线程池
		
1.前言 本章本来要讲解Netty的线程模型的,但是由于其是基于Java线程池设计而封装的,所以我们先详细学习一下Java中的线程池的设计.之前也说过Netty5被放弃的原因之一就是forkjoin结 ...
 - 捕获Java线程池执行任务抛出的异常
		
捕获Java线程池执行任务抛出的异常Java中线程执行的任务接口java.lang.Runnable 要求不抛出Checked异常, public interface Runnable { publi ...
 - JAVA线程池ScheduledExecutorService周期性地执行任务 与单个Thread周期性执行任务的异常处理
		
本文记录: 1,使用ScheduledExecutorService的 scheduleAtFixedRate 方法执行周期性任务的过程,讨论了在任务周期执行过程中出现了异常,会导致周期任务失败. 2 ...
 - java并发编程(四) 线程池 & 任务执行、终止源码分析
		
参考文档 线程池任务执行全过程:https://blog.csdn.net/wojiaolinaaa/article/details/51345789 线程池中断:https://www.cnblog ...
 - 【Java线程池快速学习教程】
		
1. Java线程池 线程池:顾名思义,用一个池子装载多个线程,使用池子去管理多个线程. 问题来源:应用大量通过new Thread()方法创建执行时间短的线程,较大的消耗系统资源并且系统的响应速度变 ...
 - Java线程池详解(二)
		
一.前言 在总结了线程池的一些原理及实现细节之后,产出了一篇文章:Java线程池详解(一),后面的(一)是在本文出现之后加上的,而本文就成了(二).因为在写完第一篇关于java线程池的文章之后,越发觉 ...
 - Java线程池使用和源码分析
		
1.为什么使用线程池 在多线程编程中一项很重要的功能就是执行任务,而执行任务的方式有很多种,为什么一定需要使用线程池呢?下面我们使用Socket编程处理请求的功能,分别对每种执行任务的方式进行分析. ...
 - Java线程池快速学习教程
		
1. Java线程池 线程池:顾名思义,用一个池子装载多个线程,使用池子去管理多个线程. 问题来源:应用大量通过new Thread()方法创建执行时间短的线程,较大的消耗系统资源并且系统的响应速度变 ...
 
随机推荐
- SQL语句优化技术分析 整理他人的
			
一.操作符优化 1.IN 操作符 用IN写出来的SQL的优点是比较容易写及清晰易懂,这比较适合现代软件开发的风格.但是用IN的SQL性能总是比较低的,从Oracle执行的步骤来分析用IN的SQL与不用 ...
 - LWP::UserAgent介绍2
			
#这个LWP::UserAgent一般要配合其他模块使用 #比如: #HTTP::Request #HTTP::Cookie #HTTP::Respose #HTTP::Status #LWP::Us ...
 - pythonRedis 订阅功能实现
			
两天机器做,host要写订阅主机的ip,客户端发消息,服务端订阅消息 cat redis_connector.py #!/usr/bin/env python__author__ = 'Q.Li'im ...
 - 二十、oracle pl/sql基础
			
一.pl/sql developer开发工具pl/sql developer是用于开发pl/sql块的集成开发环境(ide),它是一个独立的产品,而不是oracle的一个附带品. 二.pl/sql介绍 ...
 - Android app作为系统应用实现功能笔记
			
1.禁用StatusBar相关功能需要添加权限 <uses-permission android:name="android.permission.STATUS_BAR"&g ...
 - express学习点滴- methodOverride
			
app.use(express.methodOverride());在app.js中可以看到这个中间件,去翻文档,几乎没有提到.一番寻找,整理如下. 作用是使用REST风格的http请求时,进行改写后 ...
 - 网站常用js代码搜集
			
1.若是手机端打开,则跳转到手机页面 <script language="javascript"> if(navigator.userAgent.match(/(iPh ...
 - javascript生成新标签的三种方法
			
javascript生成新标签的三种方法:http://www.cnblogs.com/online-link/p/6062423.html
 - EasyuiAPI:基础
			
一.EasyLoader(简单加载) locale属性:值类型是string locales属性:值类型是object 二.Draggable(拖动) 1.通过标签创建: <div id=&qu ...
 - js提交form表单
			
<form action="/Enterprise/member" id="sendinviteid" method="post"&g ...