当前位置: 首页 > news >正文

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();

    }
}

 

转载于:https://www.cnblogs.com/liuhuan425/p/10845271.html

相关文章:

  • 球谐光照——杂谈——待完成
  • 基于体素的全局光照技术
  • 路径追踪技术
  • 辐射度方法
  • [计算机体系结构:量化研究方法]学习笔记:Chapter 1
  • 基于预计算辐射传递的全局光照技术
  • 傅里叶变换
  • PhpStorm插件之Translation
  • 小波变换原理
  • 如何通俗地理解傅立叶变换?
  • T函数
  • 分部积分法
  • mssql sqlserver 使用SSMS运行sql脚本的六种方法分享
  • 探讨基于球谐函数的全局光照
  • vue的实例属性$data
  • 分享的文章《人生如棋》
  • 【译】React性能工程(下) -- 深入研究React性能调试
  • chrome扩展demo1-小时钟
  • el-input获取焦点 input输入框为空时高亮 el-input值非法时
  • in typeof instanceof ===这些运算符有什么作用
  • JAVA多线程机制解析-volatilesynchronized
  • Linux学习笔记6-使用fdisk进行磁盘管理
  • NLPIR语义挖掘平台推动行业大数据应用服务
  • oldjun 检测网站的经验
  • SpiderData 2019年2月25日 DApp数据排行榜
  • Sublime Text 2/3 绑定Eclipse快捷键
  • vue总结
  • 发布国内首个无服务器容器服务,运维效率从未如此高效
  • 基于Android乐音识别(2)
  • 基于axios的vue插件,让http请求更简单
  • 基于webpack 的 vue 多页架构
  • 类orAPI - 收藏集 - 掘金
  •  一套莫尔斯电报听写、翻译系统
  • 移动端唤起键盘时取消position:fixed定位
  • 整理一些计算机基础知识!
  • ​LeetCode解法汇总2182. 构造限制重复的字符串
  • ​比特币大跌的 2 个原因
  • #单片机(TB6600驱动42步进电机)
  • #微信小程序(布局、渲染层基础知识)
  • (1)Android开发优化---------UI优化
  • (ctrl.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MDd_DynamicDebug”不匹配值“
  • (NO.00004)iOS实现打砖块游戏(十二):伸缩自如,我是如意金箍棒(上)!
  • (附源码)springboot炼糖厂地磅全自动控制系统 毕业设计 341357
  • (附源码)ssm高校志愿者服务系统 毕业设计 011648
  • (附源码)小程序儿童艺术培训机构教育管理小程序 毕业设计 201740
  • (六)激光线扫描-三维重建
  • (完整代码)R语言中利用SVM-RFE机器学习算法筛选关键因子
  • (转)EOS中账户、钱包和密钥的关系
  • (转)Spring4.2.5+Hibernate4.3.11+Struts1.3.8集成方案一
  • (转)从零实现3D图像引擎:(8)参数化直线与3D平面函数库
  • (转)拼包函数及网络封包的异常处理(含代码)
  • (转载)CentOS查看系统信息|CentOS查看命令
  • .NET Core MongoDB数据仓储和工作单元模式封装
  • .NET 设计一套高性能的弱事件机制
  • .NET 使用 ILMerge 合并多个程序集,避免引入额外的依赖