zoukankan      html  css  js  c++  java
  • java实现多线程(下)

    JDK5.0新增了两种线程创建方式:

    新增方式一:实现Callable接口

    1.与使用Runnable相比,Callable功能更强大:

      >相比run()方法,可以有返回值

      >方法可以抛出异常

      >支持泛型的返回值

      >需要借助FutureTask类,比如获取返回结果

    2.创建流程:

    ①创建一个实现Callable的实现类

    ②实现call方法,将此线程需要执行的操作声明在call()中

    ③创建Callable接口实现类的对象

    ④将此Callable接口实现类的对象作为传递到FutureTask构造器中,创建FutureTask的对象

    ⑤将FutureTask的对象作为参数传递到Thread类的构造器中,创建Thread类,并调用start()

    如果想有返回值,那么可以再增加⑥FutureTask的对象调用get()获取Callable实现类中的call重写方法的返回值。

    class MyThread03 implements Callable<Integer> {
        @Override
        public Integer call() throws Exception {
            System.out.println("-----MyThread03");
            return 200;
        }
    }
    
    
    public class ThreadNew {
        public static void main(String[] args) {
     
            FutureTask<Integer> futureTask = new FutureTask<Integer>(new MyThread03());
            new Thread(futureTask).start();
            try {
                Integer value = futureTask.get();
                System.out.println(value);
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (ExecutionException e) {
                e.printStackTrace();
            }
        }
    }

    新增方式二:使用线程池

    线程池相关API:ExecutorService和Executors

    1.ExecutorService:真正的线程池接口。创建子类ThreadPoolExecutor

      >void exectute(Runnable command):执行命令,没有返回值,一般用来执行Runnable

      ><T>Future<T>submit(Callable<T>task):执行任务,有返回值,一般用来执行Callable

      >void shutdown():关闭连接池

    2.Executors:工具类、线程池的工厂类,用于创建并返回不同类型的线程池

      >Executors.newCachedThreadPool():创建一个可根据需要创建新线程的线程池

      >Executors.newFixedThreadPool(n):创建一个可重用固定线程数的线程池

      >Executors.newSingleThreadExecutor():创建一个只有一个线程的线程池

      >Executors.newScheduledThreadPool(n):创建一个线程池,它可安排在给定延迟后运行命令或定期执行。

    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    //创建并使用多线程的第四种方法:使用线程池
    class MyThread implements Runnable {
    
        @Override
        public void run() {
            for (int i = 1; i <= 100; i++) {
                System.out.println(Thread.currentThread().getName() + ":" + i);
            }
        }
    
    }
    
    public class ThreadPool {
        public static void main(String[] args) {
            // 1.调用Executors的newFixedThreadPool(),返回指定线程数量的ExecutorService
            ExecutorService pool = Executors.newFixedThreadPool(10);
            // 2.将Runnable实现类的对象作为形参传递给ExecutorService的submit()方法中,开启线程
            // 并执行相关的run()
            pool.execute(new MyThread());
            pool.execute(new MyThread());
            pool.execute(new MyThread());
            // 3.结束线程的使用
            pool.shutdown();
    
        }
    }
  • 相关阅读:
    zoj 1649 Rescue
    poj 1659 Frogs' Neighborhood
    hdu 1385 Minimum Transport Cost
    hdu 2680 Choose the best route
    写了一下午的dijkstra。突然发现我写的根本不是dijkstra。。。。是没优化过的BFS.......
    hdu 1548 A strange lift
    hdu 2066 一个人的旅行
    hdu 2544 最短路
    洛谷 P3253 [JLOI2013]删除物品 解题报告
    洛谷 P10P1343 地震逃生 改错
  • 原文地址:https://www.cnblogs.com/liuhuan425/p/10845271.html
Copyright © 2011-2022 走看看