谁能详细的解释一下线程池的原理以及使用的方法和注意事项吗
输出一下类的路径 System.getproperty(”java.class.path“)方法,该方法能让你至少可以领略到实际存在的运行期间的classpath,你看一下输出的路径是否和你要求的路径一致。
程池的工作模型主要两部分组成,一部分是运行Runnable的Thread对象,另一部分就是阻塞队列。
由线程池创建的Thread对象其内部的run方法会通过阻塞队列的take方法获取一个Runnable对象,然后执行这个Runnable对象的run方法(即,在Thread的run方法中调用Runnable对象的run方法)。当Runnable对象的run方法执行完毕以后,Thread中的run方法又循环的从阻塞队列中获取下一个Runnable对象继续执行。这样就实现了Thread对象的重复利用,也就减少了创建线程和销毁线程所消耗的资源。
当需要向线程池提交任务时会调用阻塞队列的offer方法向队列的尾部添加任务。提交的任务实际上就是是Runnable对象或Callable对象。
案例:
package javalearning;
import java.util.Random;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class ThreadPoolDemo {
static class Task implements Runnable{
private String id;
Task(String id){
this.id = id;
}
@Override
public void run() {
System.out.println("Thread "+id+" is working");
try {
//每个任务随机延时1s以内的时间以模拟线程的运行
Thread.sleep(new Random().nextInt(1000));
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Thread "+id+" over");
}
}
public static void main(String[] args) {
ExecutorService threadPool = Executors.newFixedThreadPool(3);//线程池中,3工作线程
threadPool.execute(new Task("a"));
threadPool.execute(new Task("b"));
threadPool.execute(new Task("c"));
threadPool.execute(new Task("d"));
threadPool.execute(new Task("e"));
threadPool.shutdown();
while(!threadPool.isTerminated()){
}
System.out.println("Thread Pool is over");
}
}
执行结果:
Thread a is working
Thread c is working
Thread b is working
Thread a over
Thread d is working
Thread d over
Thread e is working
Thread e over
Thread b over
Thread c over
Thread Pool is over
最多有三个线程并发执行,超过三个任务以后,线程池会将任务存储于阻塞队列中。
推荐一遍博客给楼主 可以去看看 里面有手写的线程池实现
http://blog.csdn.net/u013278314/article/details/78354575