首页 > 编程语言 >【Java】JDK5.0新增的创建多线程的方式:实现Callable接口,使用线程池

【Java】JDK5.0新增的创建多线程的方式:实现Callable接口,使用线程池

时间:2022-11-21 11:26:45浏览次数:62  
标签:Java 创建 sum Callable 线程 new 多线程 public

1.实现Callable接口方式

和实现Runnable接口相比

  • call()可以有返回值。
  • call()可以抛出异常,被外面的操作捕获,获取异常信息。
  • Callable是支持泛型的。

实现Callable接口的方式,线程计算0~100内的偶数

实现类,重写call()方法,可以返回值和抛出异常

public class NumThread implements Callable {
    @Override
    public Object call() throws Exception {
        int sum = 0;
        for (int i = 0; i < 100; i++) {
            if (i%2==0){
                System.out.println(i);
                sum+=i;
            }
        }
        return sum;
    }
}

测试

public class Test {
    public static void main(String[] args) {
        NumThread numThread = new NumThread();	//实现类对象
        FutureTask futureTask = new FutureTask(numThread);	//numThread作为参数传递到构造器中,创建FutureTask对象
        new Thread(futureTask).start();	//futuretask对象作为参数传递到thread类构造器中,创建thread对象,调用start启动线程

        try {
            Object sum = futureTask.get();	//获取call方法的返回值
            System.out.println("总和为:"+sum);
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
    }
}

2.使用线程池方式

使用线程池的好处

  1. 提高响应速度(减少了创建新线程的时间)
  2. 降低资源消耗(重复利用线程池中线程,不需要每次都创建)
  3. 便于线程管理
    • corePoolSize:核心池的大小(最小线程数量,不会被销毁)
    • maximumPoolSize:最大线程数
    • keepAliveTime:线程没有任务时最多保持多长时间后会终止

线程1,打印100以内偶数

public class NumberThread1 implements Runnable{

    @Override
    public void run() {
        for (int i = 0; i <= 100; i++) {
            if (i%2==0){
                System.out.println(Thread.currentThread().getName()+":"+i);
            }
        }
    }
}

线程2,打印100以内奇数

public class NumberThread2 implements Runnable{
    @Override
    public void run() {
        for (int i = 0; i <=100; i++) {
            if (i%2!=0){
                System.out.println(Thread.currentThread().getName()+":"+i);
            }

        }
    }
}

创建线程池执行线程,executors方式创建线程池。

public class ThreadPool {
    public static void main(String[] args) {
        ExecutorService pool = Executors.newFixedThreadPool(10);   //创建固定大小的线程池

        //执行指定线程,execute或submit方式
        pool.execute(new NumberThread1());
        pool.execute(new NumberThread2());

//        pool.submit(Callable callable);

        pool.shutdown();    //关闭线程池
    }
}

ThreadPoolExecutor方式创建线程池可以设置其7个参数。

参考链接:
1.浅谈Java多线程之FutureTask
2.线程池的参数
3.java线程池ThreadPoolExecutor类使用详解
4.线程池的7种创建方式,强烈推荐你用它

标签:Java,创建,sum,Callable,线程,new,多线程,public
From: https://www.cnblogs.com/zhishu/p/16903903.html

相关文章

  • Java工具库Guava本地缓存Cache的使用、回收、刷新、统计等示例
    场景Java核心工具库Guava介绍以及Optional和Preconditions使用进行非空和数据校验:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/127683387在上面引入Gua......
  • 轻松学会JavaScript事件
    文章目录​​事件与事件流​​​​事件监听(绑定事件方法)​​​​JavaScript事件​​​​鼠标事件​​​​表单事件​​​​键盘事件​​​​UI事件​​​​快速投票​​  ......
  • Java集合
    集合集合类的特点:提供一种存储空间可变的存储模型,存储的数据容量可以随时发生改变。1.Collection(接口):单列集合 List(接口):元素可重复 ArrayList(实现类): Linke......
  • java常用类
    日期LocalDateTime时间格式化LocalDateTimetime=techLogicTablePo.getCreateTime();DateTimeFormatterdateTimeFormatter=DateTimeFormatter.ofPattern("yyyy-MM......
  • Java实现双向循环链表
    上一篇文章实现了单向循环链表,双向很简单,在单向循环链表的基础上加一个前驱指针,节点类如下:/***双向链表节点*/publicclassNode{privateintdata;//数据......
  • JavaScript基础快速复习
    目录学习信息01初识JavaScript浏览器执行JS过程JS的组成JS初体验JS的注释02JavaScript输入输出语句03变量变量概述变量的使用变量的语法扩展变量的命名规范04数......
  • 【java技术总结】编码总结
    java中的编解码1.ISO-8859-1单字节编码收录的字符除ASCII收录的字符外,还包括西欧语言、希腊语、泰语、阿拉伯语、希伯来语对应的文字符号。2.gb2312变长1-2字节GB......
  • JavaSE
    Java基础JDK(JavaDevelopmentKit)Java开发工具包JRE(JavaRuntimeEnvironment)Java运行环境JVM(JavaVirtualMachine)Java虚拟机\[\begin{array}{l}JDK&=......
  • 【java技术总结】将中文通过ISO-8859-1方式编码传输
    在Java中,String的getBytes()方法是得到一个操作系统默认的编码格式的字节数组。这个表示在不同情况下,返回的东西不一样!String.getBytes(Stringdecode)方法会根据指定的de......
  • 在java中new一个对象的流程是什么?
    Dogdog=newDog()背后执行过程这个涉及到字节码文件结构,类加载机制,堆,栈的认识等知识点。在执行new的时候可以大致分为二个过程,初始化以及实例化,初始化就是类的加载过程,......