实现简单的线程池

public class Pthread extends Thread {

	private ThreadPool pool;  
    private volatile boolean isShutdown;  
    private Runnable target;  
  
    public Pthread(Runnable task, ThreadPool pool) {  
        this.target = task;  
        this.pool = pool;  
        isShutdown = false;  
    }  
  
    @Override  
    public void run() {  
        while (!isShutdown) {  
            if (target != null) {  
                target.run();  
            }  
            try {  
            	//空闲线程对象放入池中
            	
                pool.putThread(this); 
                //System.out.println(pool.getThreadCount());
                // 线程执行完任务,会在wait处阻塞,直到 setTarget或者 shutdown 调用notifyAll  
                synchronized (this) {  
                    wait();  
                }  
            } catch (InterruptedException e) {  
  
            }  
        }  
    }  
  
    // 每当设置任务或关闭时会唤醒run方法  
    synchronized public void setTarget(Runnable r) {  
        this.target = r;  
        notifyAll();  
    }  
  
    synchronized public void shutdown() {  
        isShutdown = true;  
        notifyAll();  
    }  
 
}


public class ThreadPool {

	//使用单例模式创建线程池  
    private static ThreadPool pool;  
  
    private final List<Pthread> threads;  
    private volatile boolean isShutdown; 
  
    // 在线程中调用,用来将自己加入线程池中  
    synchronized public void putThread(Pthread t) {  
        if (!isShutdown) {  
            threads.add(t);  
        } else {  
            t.shutdown();  
        }  
    }  
  
    // 客户端用来执行自己的一项任务  
    synchronized public void start(Runnable task) {  
        if (!isShutdown) { 
        	//只有闲置的线程才被放入threadpool中
            if (threads.size() < 1) {  
                new Pthread(task, pool).start();  
            } else { 
            	//从池中取出闲置线程,赋予其任务,任务执行结束后再次放入threadpool中
                Pthread p = threads.remove(0);  
                p.setTarget(task);  
            }  
        }  
    }  
  
    //初始化一个大小为5的线程池数组  
    synchronized public static ThreadPool getThreadPool() {  
        if (pool == null) {  
            pool = new ThreadPool(5);  
        }  
        return pool;  
    }  
  
    public ThreadPool(int poolSize) {  
        threads = new Vector<Pthread>(poolSize);  
        isShutdown = false;
    }  
  
    //如果关闭线程池,需要将所有线程也关闭  
    synchronized public void shutdown() {  
        for(Pthread p : threads)  
            p.shutdown();  
        threads.clear();  
        isShutdown = true;  
    }  
      
    public int getThreadCount(){  
        return threads.size();  
    }  
}  

public class TestMain {

	public static void main(String[] args) throws InterruptedException {  
        ThreadPool pool = ThreadPool.getThreadPool();
        Thread.sleep(1500);
        Runnable r = new Runnable() {  
            public void run() {  
                System.out.println(Thread.currentThread().getName());  
//                try {  
//                    Thread.sleep(1000);  
//                } catch (InterruptedException e) {  
//                    e.printStackTrace();  
//                }  
            }  
        };  
        for (int i = 0; i < 1000; i++)  
            pool.start(r);  
        Thread.sleep(1500);  
        System.out.println(pool.getThreadCount());  
//        pool.shutdown();  
//        Thread.sleep(1000);  
//        System.out.println(pool.getThreadCount());  
    }  
}

1.线程本身就是一个对象, 上述代码中有一步先在自己的线程中获取自身线程的对象锁, 然后执行wait方法, 注意理解

2.继承自thread的线程实例化后执行start方法, 启动线程

实现runnable接口的线程实例化后在实例化一个thread对象并作为其参数, 执行start方法, 启动线程

3 线程池

1) 实现一个普通的对象池

2) 实现一个永不退出的线程, 实现方式:在润run方法中使用while进行死循环

3) 永不退出的线程在执行完当前任务后, 将自身放入到线程池中等到有新任务时被取出

4) 永不退出线程 执行wait方法, 释放资源占用, 等待新的任务加入, 然后再被唤醒继续执行新的任务

5) 新的任务加入到线程池时, 从线程池中获取一个限制的永不退出线程, 把新的任务交给取出的永不退出线程, 当有新的任务加入到永不退出线程时, 永不退出线程被唤醒, 然后来执行新的任务

4. 池化技术的原理: 对象使用结束后把对象内存地址保存, 保证不被gc回收, 下次调用该对象时能正确寻址

posted @ 2017-09-20 17:09  車輪の唄  阅读(9)  评论(0编辑  收藏  举报  来源