zoukankan      html  css  js  c++  java
  • 线程的创建启动及线程池的使用

    1 继承extends  Tread

    覆盖Thread类中的run方法.  

    在run方法中编写需要执行的操作  

    在main方法(线程)中,创建线程对象,并调用start()方法启动线程.  

    2 实现Runnable接口

    1):定义一个类A实现于java.lang.Runnable接口,注意A类不是线程类.

    2):在A类中覆盖Runnable接口中的run方法.

    3):我们在run方法中编写需要执行的操作:run方法里的,线程执行体.

    4):在main方法(线程)中,创建线程对象,并启动线程.

         (1)创建线程类对象:

         Thread  t = new Thread(new  A());    

         (2)调用线程对象的start方法:

         t.start();

     

    3 线程池的使用以及启动线程

    ExecutorService的submit与execute方法都能执行任务,但在使用过程,发现其对待run方法抛出的异常处理方式不一样。
    两者执行任务最后都会通过Executor的execute方法来执行,但对于submit,会将runnable物件包装成FutureTask<Object>,其run方法会捕捉被包装的Runnable Object的run方法抛出的Throwable异常,待submit方法所返回的的Future Object调用get方法时,将执行任务时捕获的Throwable Object包装成java.util.concurrent.ExecutionException来抛出。
    而对于execute方法,则会直接抛出异常,该异常不能被捕获,想要在出现异常时做些处理,可以实现Thread.UncaughtExceptionHandler接口

    ThreadPoolExecutor executor = new ThreadPoolExecutor (200, 300,10, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(5));

    Runnable r = new Runnable(){

      @Override

      public void run() {

        //具体的任务,创建新的客户端连接到服务器

        System.out.println("线程r正在运行"); }

      };

    }

    executor.execute(r);

    executor.shutdown();

    shutdown调用后,不可以再submit新的task,已经submit的将继续执行。

    shutdownNow试图停止当前正执行的task,并返回尚未执行的task的list

    4 线程回调函数:获取线程信息

    Thread.currentThread().ManagedThreadId

    5 Callable

    public class ExecutorServiceTest {
    public static void main(String[] args) {
    ExecutorService executorService = Executors.newCachedThreadPool();
    List<Future<String>> resultList = new ArrayList<Future<String>>();
    // 创建10个任务并执行
    for (int i = 0; i < 10; i++) {
    // 使用ExecutorService执行Callable类型的任务,并将结果保存在future变量中
    Future<String> future = executorService.submit(new TaskWithResult(i));
    // 将任务执行结果存储到List中
    resultList.add(future);
    }
    executorService.shutdown();

    // 遍历任务的结果
    for (Future<String> fs : resultList) {
    try {
    System.out.println(fs.get()); // 打印各个线程(任务)执行的结果
    } catch (InterruptedException e) {
    e.printStackTrace();
    } catch (ExecutionException e) {
    executorService.shutdownNow();
    e.printStackTrace();
    return;
    }
    }
    }
    }

    class TaskWithResult implements Callable<String> {
    private int id;

    public TaskWithResult(int id) {
    this.id = id;
    }

    /**
    * 任务的具体过程,一旦任务传给ExecutorService的submit方法,则该方法自动在一个线程上执行。
    *
    * @return
    * @throws Exception
    */
    public String call() throws Exception {
    System.out.println("call()方法被自动调用,干活!!! " + Thread.currentThread().getName());
    if (new Random().nextBoolean())
    throw new TaskException("Meet error in task." + Thread.currentThread().getName());
    // 一个模拟耗时的操作
    for (int i = 999999999; i > 0; i--)
    ;
    return "call()方法被自动调用,任务的结果是:" + id + " " + Thread.currentThread().getName();
    }
    }

    class TaskException extends Exception {
    public TaskException(String message) {
    super(message);
    }
    }

  • 相关阅读:
    oj1089-1096总结(输入输出练习)
    oj 1002题 (大数题)
    第五次博客园作业+
    第五次博客园作业-
    博客园第四次作业
    博客园第四次作业
    C语言第三次作业
    c语言第三次作业
    设计模式第一次作业
    项目选题报告(团队)
  • 原文地址:https://www.cnblogs.com/yzlsthl/p/8610937.html
Copyright © 2011-2022 走看看