线程池

线程池的好处

  1. 降低资源消耗。减少了创建和销毁线程的次数,每个工作线程都可以被重复利用,可执行多个任务。
  2. 提高响应速度。当任务到达时,任务可以不需要的等到线程创建就能立即执行。
  3. 提高线程的可管理性。可以根据系统的承受能力,调整线程池中工作线线程的数目,防止因为消耗过多的内存,而把服务器累趴下(每个线程需要大约1MB内存,线程开的越多,消耗的内存也就越大,最后死机)。

Runnable实现类代码:

public class MyRunnable implements Runnable {
    @Override
    public void run() {
        System.out.println("实现Runnable方式的任务...");
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("任务结束");
    }
}

线程池测试类:

public class Test {
    public static void main(String[] args)throws Exception {
        /*
            线程池的使用:
                1.真正的线程池接口是java.util.concurrent.ExecutorService。
                2.Executors线程工具类里面提供了一些静态方法,生成一些常用的线程池
                3.Executors线程工具类:
                    public static ExecutorService newFixedThreadPool(int nThreads):获取线程池,指定线程数量
                4.ExecutorService线程池接口:
                    - public Future<?> submit(Runnable task):获取线程池中的某一个线程对象,并执行任务
                    - public <T> Future<T> submit(Callable<T> task):获取线程池中的某一个线程对象,并执行任务
                    Future用来封装任务执行之后返回的结果:
                        对于Runnable的任务,这个返回值Future就没啥用,因为run方法没有返回值
                        对于Callable的任务,这个返回值Future就有用,因为call方法有返回值,这个返回值就封装到了Future对象中
                        如何获取Future封装的返回值结果: 调用Future接口中的get方法
                5.线程池的使用步骤:
                    1.创建线程池
                    2.提交任务,执行任务
                    3.销毁线程池(一般不操作)
         */
        // 创建线程池
        ExecutorService es = Executors.newFixedThreadPool(3);

        // 提交任务,执行任务
        MyRunnable mr1 = new MyRunnable();
        MyRunnable mr2 = new MyRunnable();
        MyRunnable mr3 = new MyRunnable();
        MyRunnable mr4 = new MyRunnable();
        MyRunnable mr5 = new MyRunnable();
        es.submit(mr1);
        es.submit(mr2);
        es.submit(mr3);
        es.submit(mr4);
        Future<?> f = es.submit(mr5);
        System.out.println(f.get());// null

        // 销毁线程池
        //es.shutdown();
    }
}

Callable测试代码:

  • Future submit(Callable task) : 获取线程池中的某一个线程对象,并执行.
    Future : 表示计算的结果.
  • V get() : 获取计算完成的结果。
public class MyCallable implements Callable<String> {
    @Override
    public String call() throws Exception {
        System.out.println("实现Callable方式的任务");
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("任务结束");
        return "java";
    }
}
public class Test {
    public static void main(String[] args)throws Exception {
        // 创建线程池
        ExecutorService es = Executors.newFixedThreadPool(3);

        // 提交任务,执行任务
        MyCallable mc1 = new MyCallable();
        MyCallable mc2 = new MyCallable();
        MyCallable mc3 = new MyCallable();
        MyCallable mc4 = new MyCallable();
        MyCallable mc5 = new MyCallable();

        es.submit(mc1);
        es.submit(mc2);
        es.submit(mc3);
        es.submit(mc4);
        Future<String> f = es.submit(mc5);
        System.out.println(f.get());// java

        // 销毁线程池
        //es.shutdown();
    }
}

上一篇:sqli-labs靶场11-12关(基于POST联合查询)


下一篇:ServiceNow 在onSubmit方法中进行Ajax查询校验数据