码迷,mamicode.com
首页 > 编程语言 > 详细

Java--线程池

时间:2015-10-28 14:22:24      阅读:247      评论:0      收藏:0      [点我收藏+]

标签:

package util;

public abstract class Runnable implements java.lang.Runnable
{
    private int priority;

    public Runnable()
    {
        this.priority = 0;
    }

    public int getPriority()
    {
        return priority;
    }

    public void setPriority(int priority)
    {
        this.priority = priority;
    }

    public static void main(String[] args)
    {
        String libname = System.mapLibraryName("");
    }
}

 

import java.util.Timer;
import java.util.TimerTask;

/**
 * 被观察者,每秒钟通知观察者检查任务
 * 
 * @author guoxiaoming
 * 
 */
public class TimerObserver extends java.util.Observable
{
    public static TimerObserver instance = new TimerObserver();

    public static long now = System.currentTimeMillis();

    public static Timer timer;

    // 每秒钟都会通知观察者检查自己的任务是否可以开始执行
    public TimerObserver()
    {
        timer = new Timer("schedule-task");
        timer.schedule(new TimerTask()
        {
            public void run()
            {
                now = scheduledExecutionTime();
                instance.setChanged();
                instance.notifyObservers();
            }
        }, 0, 1000);
    }
}
import java.util.Collections;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.Map;
import java.util.Observable;
import java.util.Observer;
import java.util.Set;
import java.util.SortedMap;
import java.util.TreeMap;

import util.Runnable;

/**
 * 观察者对象,保存着任务集合,被观察者每1s钟通知观察者检查任务 确实也可能出现后添加的任务可能比先添加的任务先执行
 * 
 * @author guoxiaoming
 * 
 */
public class TimerTask implements Observer
{
    private class TaskPair
    {
        private Runnable runnable;

        private long waitSeconds;

        public TaskPair(Runnable runnable, long waitSeconds)
        {
            this.runnable = runnable;
            this.waitSeconds = waitSeconds;
        }
    }

    public long elapse = 0;

    public static SortedMap<Long, LinkedList<TaskPair>> taskList = Collections
            .synchronizedSortedMap(new TreeMap<Long, LinkedList<TaskPair>>());

    public TimerTask()
    {
        TimerObserver.instance.addObserver(this);
    }

    @Override
    public synchronized void update(Observable o, Object arg)
    {
        Set<Map.Entry<Long, LinkedList<TaskPair>>> entrySet = taskList
                .entrySet();
        Iterator<Map.Entry<Long, LinkedList<TaskPair>>> iter = entrySet
                .iterator();
        elapse++;
        while (iter.hasNext())
        {
            Map.Entry<Long, LinkedList<TaskPair>> entry = iter.next();
            LinkedList<TaskPair> linkedTask = entry.getValue();

            Iterator<TaskPair> itertask = linkedTask.iterator();
            while (itertask.hasNext())
            {
                TaskPair task = itertask.next();
                if (task.waitSeconds > elapse)
                {
                    break;
                }
                ThreadPool.addTask(task.runnable);
                itertask.remove();
            }
            if (linkedTask.size() == 0)// linkedTask.isEmpty()
            {
                iter.remove();
            }
        }
    }

    // 其实两个方法可以合并成一个方法的 每个LinkedList当中的任务都是后添加的在前面
    public synchronized  void addTask(Runnable runnable, long waitSeconds)
    {
        LinkedList<TaskPair> ll = taskList.get(waitSeconds);
        if (ll == null)
        {   
            ll = new LinkedList<TaskPair>();
            taskList.put(waitSeconds,ll);
            
        }
        synchronized (ll)
        {
            // 此处应该使用addLast而不是addFirst
            ll.addLast(new TaskPair(runnable, waitSeconds + elapse));
        }
    }
}
import java.util.Collections;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.Map;
import java.util.SortedMap;
import java.util.TreeMap;
import java.util.Map.Entry;

import util.Runnable;

//线程池
public class ThreadPool implements java.lang.Runnable
{
    // key 优先级 value 线程列表
    private static SortedMap<Integer, LinkedList<Runnable>> tasks = Collections.synchronizedSortedMap(new TreeMap<Integer, LinkedList<Runnable>>());

    private int priority;

    private static int task_count;

    private static Object task_count_locker = new Object();

    private static long time_lastAdd;

    // 记录各个优先级线程管理的任务数,本身管理线程也算是一个任务
    private static SortedMap<Integer, Integer> count = new TreeMap<Integer, Integer>();

    private ThreadPool(int priority)
    {
        this.priority = priority;
        synchronized (count)
        {
            Integer c = count.get(priority);
            count.put(priority, c == null ? 1 : c.intValue() + 1);
        }
    }

    @Override
    public void run()
    {
        for (;;)
        {
            try
            {
                Runnable r = null;
                LinkedList<Runnable> ll = tasks.get(priority);
                synchronized (ll)
                {
                    if (ll.isEmpty())
                    {
                        ll.wait();
                    }
                    r = ll.removeLast();
                    synchronized (task_count_locker)
                    {
                        task_count--;
                    }
                }
                r.run();
            }
            catch(Exception ex)
            {
                ex.printStackTrace();
            }

        }
    }

    // 添加新的线程
    public static void addThread(int priority)
    {
        if (tasks.get(priority) == null)
        {
            tasks.put(priority, new LinkedList<Runnable>());
            new Thread(new ThreadPool(priority), "thread---" + priority).start();

        }
    }

    // 添加新的任务 静态方法中只能使用静态变量 非静态方法中可以使用静态变量
    public static void addTask(Runnable runnable)
    {
        int prior = runnable.getPriority();
        LinkedList<Runnable> ll = tasks.get(prior);
        if (ll == null)
        {
            System.out.println("no match priority thread");
            return;
        }
        synchronized (ll)
        {
            synchronized (task_count_locker)
            {
                task_count++;
            }
            ll.add(runnable);// 其实addFirst还是add区别不大
            time_lastAdd = System.currentTimeMillis();
            ll.notify();
        }
    }

    // 得到一个映射拷贝
    public static Map<Integer, Integer> getTaskCounts()
    {
        SortedMap<Integer, Integer> map = new TreeMap<Integer, Integer>();
        synchronized (count)
        {
            for (Iterator<Integer> iter = tasks.keySet().iterator(); iter.hasNext();)
            {
                Integer prior = iter.next();
                map.put(prior, tasks.get(prior).size());
            }
            // 或者
            for (Entry<Integer, LinkedList<Runnable>> iter : tasks.entrySet())
            {
                map.put(iter.getKey(), iter.getValue().size());
            }
            // 再或者使用繁琐的while循环
            // Set<Map.Entry<Integer,LinkedList<Runnable>>>
        }
        return map;
    }

    public static long getTaskTotal()
    {
        synchronized (task_count_locker)
        {
            return task_count;
        }
    }

}
import util.Runnable;

public class MainTest
{
    public static void main(String[] args) throws InterruptedException
    {
        // 添加1-10 10个优先级的管理线程
        for (int i = 1; i <= 10; i++)
        {
            ThreadPool.addThread(i);
        }
        TimerTask timerTask = new TimerTask();
        for (int i = 1; i <= 10; i++)
        {
            timerTask.addTask(new RunnableTask(i), i);
        }
    }

    static class RunnableTask extends Runnable
    {

        public RunnableTask(int priority)
        {
            super.setPriority(priority);
        }

        @Override
        public void run()
        {
            int begin = (super.getPriority() - 1) * 10;
            int end = super.getPriority() * 10;
            for (int i = begin; i <= end; i++)
            {
                System.out.print(i + " ");
            }
            System.out.println();
        }
    }
}
0 1 2 3 4 5 6 7 8 9 10 
10 11 12 13 14 15 16 17 18 19 20 
20 21 22 23 24 25 26 27 28 29 30 
30 31 32 33 34 35 36 37 38 39 40 
40 41 42 43 44 45 46 47 48 49 50 
50 51 52 53 54 55 56 57 58 59 60 
60 61 62 63 64 65 66 67 68 69 70 
70 71 72 73 74 75 76 77 78 79 80 
80 81 82 83 84 85 86 87 88 89 90 
90 91 92 93 94 95 96 97 98 99 100 

 

Java--线程池

标签:

原文地址:http://www.cnblogs.com/wuxinliulei/p/4916991.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!