关于JAVA中线程池的问题

谁能详细的解释一下线程池的原理以及使用的方法和注意事项吗

3个回答

输出一下类的路径 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

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!