学习Java的第12天
时间:2020-03-26
本文章向大家介绍学习Java的第12天,主要包括学习Java的第12天使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
学习Java的第12天
1.线程间的通信
1.三个方法
- wait():令当前线程挂起并放弃CPU、同步资源并等待。
- notify():唤醒正在排队等待同步资源的线程中优先级最高者结束等待
- notifyAll ():唤醒正在排队等待资源的所有线程结束等待.
2.三个方法使用的注意事项
-
三个方法只能在同步方法 和同步代码块之间调用 否则会报java.lang.IllegalMonitorStateException异常
-
任意对象(对象是不同类的实例化)都可以作为synchronized的同步锁,
因此这三个方法只能在Object类(Object是所有类的父类)中声明。
2.多线程的创建方式之三--实现callable接口
1.优点
- 与使用Runnable相比, Callable功能更强大些
- 相比run()方法,可以有返回值
- 方法可以抛出异常
- 支持泛型的返回值
- 需要借助FutureTask类,比如获取返回结果
2.格式
class MyThread implements Callable{
@Override
public Object call() throws Exception {
int sum = 0;
for (int i = 0; i <=100; i++) {
if (i % 2 == 0){
sum = sum + i;
}
}
return sum;
//实现callable接口 可以接受call方法的返回值
}
}
public class Call {
public static void main(String[] args) {
//1.创建callable 实现类的对象
MyThread myThread = new MyThread();
//2..创建实现了future接口runnable接口的实现类的对象 并将callable实现类的对象放入构造器参数列表
FutureTask f1 = new FutureTask(myThread);
//3.将FutureTask类的对象传入thread的参数列表中
new Thread(f1).start();
try {
//4.接收返回值
Object sum = f1.get();
System.out.println("所有偶数和为:"+sum);
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
}
2.多线程的创建方式之四--线程池
1.优点
- 提高响应速度(减少了创建新线程的时间)
- 降低资源消耗(重复利用线程池中线程,不需要每次都创建)
- 便于线程管理
- corePoolSize:核心池的大小
- maximumPoolSize:最大线程数( 超过则不可加入)
- keepAliveTime:线程没有任务时最多保持多长时间后会终止
2.格式
class MyThread implements Runnable {
@Override
public void run() {
for (int i = 0; i <=100; i++) {
if (i % 2 == 0){
System.out.println(i);
}
}
}
}
class MyThread1 implements Runnable {
@Override
public void run() {
for (int i = 0; i <=100; i++) {
if (i % 2 != 0){
System.out.println(i);
}
}
}
}
class MyThread2 implements Callable{
@Override
public Object call() throws Exception {
int sum = 0;
for (int i = 0; i <=100; i++) {
if (i % 2 == 0){
sum = sum + i;
}
}
return sum;
//实现callable接口 可以接受call方法的返回值
}
}
public class ThreadPool {
public static void main(String[] args) {
//1.左边是线程池接口 右边是一个线程池的工具类进行不同的操作 比如现在就是创建一个10的线程池
ExecutorService service = Executors.newFixedThreadPool(10);
//2.将实现runable 和callable 接口实现类的对象放入参数列表 该线程启动
service.execute(new MyThread());
service.execute(new MyThread1());
service.submit(new MyThread2());
//3.关闭线程池
service.shutdown();
}
}
原文地址:https://www.cnblogs.com/wumingzhibei/p/12572941.html
- 整理的一些模版LCS(连续和非连续)
- 以太坊开发实战(第1部分:智能合约)
- spark2 sql读取数据源编程学习样例2:函数实现详解
- hdu---(4310)Hero(贪心算法)
- 数据库容器化|未来已来
- crontab命令详解
- hdu----(4308)Saving Princess claire_(搜索)
- spark2 sql读取数据源编程学习样例1
- golang的一个分页方法
- spark2 sql读取json文件的格式要求
- 容器化RDS|调度策略
- Go语言并发编程总结
- hdu------(4302)Holedox Eating(树状数组+二分)
- spark2的SparkSession思考与总结2:SparkSession有哪些函数及作用是什么
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- 线程池的基本使用
- JavaScript闭包
- Js中Currying的应用
- Qt音视频开发37-USB摄像头解码ffmpeg方案
- Navicat 环境测试 innodb 的事务隔离级别 产生的幻读 和 不可重复读
- leetcode之最长回文串
- Discourse CentOS 8 全新安装手册
- 3分钟短文:Laravel路子真野啊!路由昵称前缀中间件
- CSS中重要的BFC概念
- Redis哨兵集群中哨兵挂了,主从库还能切换吗?
- 你的 Redis 为什么变慢了?
- 解决Maven依赖冲突的好帮手,这款IDEA插件了解一下?
- Python爬虫实现HTTP网络请求多种实现方式
- 在tensorflow以及keras安装目录查询操作(windows下)
- Python调用OpenCV实现图像平滑代码实例