美文网首页
java多线程

java多线程

作者: 破晓11 | 来源:发表于2020-01-02 10:19 被阅读0次

    1.多线程的目的:充分利用cpu资源,并发做多件事

    2.线程什么时候让出cpu:

    阻塞时 wait,await等待IO

    sleep

    yield

    3.线程是什么:

    一条代码执行流,完成一组代码的执行

    这一组代码,我们往往成为一个任务

    4.cpu执行代码

    5.线程并不是越多越好

    (1)线程在java中是一个对象,每个java线程都需要一个操作系统线程支持,线程的创建,销毁需要时间,如果线程的创建时间+  销毁时间>执行任务时间,就很不合算

    (2)java对象占用堆内存,操作系统线程占用系统内存,根据jvm规范,一个线程默认最大栈1M,这个栈空间需要从系统内存中分配

    (3)操作系统需要频繁切换线程上下文(大家都想被运行),影响性能

    6.多线程的目的:充分利用cpu并发做事,将代码交给cpu执行,合适数量的线程就构成了一个池

    线程池:接收任务,放入队列,工作线程从队列中取出任务,执行,当没有任务时,线程阻塞,当有任务时,唤醒线程执行。

    public class ThreadPoolManager {

    //1.队列

        private BlockingQueueblockingQueue;

    //2.线程集合

        private Listworkers;

    public ThreadPoolManager(int taskSize,int threadSize){

    blockingQueue =new LinkedBlockingQueue<>(taskSize);

    workers = Collections.synchronizedList(new ArrayList());

    for (int i =0; i < threadSize; i++) {

    Worker worker =new Worker(this);

    workers.add(worker);

    worker.start();

    }

    }

    //将任务放入队列中

        public boolean addTask(Runnable runnable){

    if (isShutDown)

    return blockingQueue.offer(runnable);

    else

                return false;

    }

    //每个线程需要去干的活

        public static class Workerextends Thread{

    ThreadPoolManagermThreadPoolManager;

    public Worker(ThreadPoolManager threadPoolManager){

    this.mThreadPoolManager = threadPoolManager;

    }

    @Override

            public void run() {

    while (this.mThreadPoolManager.isShutDown||this.mThreadPoolManager.blockingQueue.size()>0){

    Runnable runnable =null;

    try {

    if (this.mThreadPoolManager.isShutDown) {

    runnable =mThreadPoolManager.blockingQueue.take();//以阻塞的方式拿

                        }else {

    runnable =mThreadPoolManager.blockingQueue.poll();//不阻塞

                        }

    }catch (InterruptedException e) {

    e.printStackTrace();

    }

    if (runnable!=null){

    runnable.run();

    System.out.println("当前线程:"+Thread.currentThread().getName()+"执行了");

    }

    }

    }

    }

    private volatile boolean isShutDown =true;

    public void shutDown(){

    isShutDown =false;

    for (Thread worker :workers) {

    if (worker.getState().equals(Thread.State.BLOCKED))

    worker.interrupt();

    }

    }

    }

    相关文章

      网友评论

          本文标题:java多线程

          本文链接:https://www.haomeiwen.com/subject/ummnoctx.html