多线程之传统多线程
时间:2022-04-26
本文章向大家介绍多线程之传统多线程,主要内容包括传统线程技术、传统定时器技术、互斥、同步、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。
Contents
传统线程技术
传统创建线程方式
1.继承Thread类,覆盖run方法
Thread t = new Thread();
t.start();
2.实现Runnable接口
Runnable不是线程,是线程要运行的代码的宿主。
1.看看Thread类源码,捋清Runnable,target,run,start关系
-
Runnable
是一个接口 -
target
是Thread
类中类型为Runnable
,名为target
的属性 -
run
是Thread
类实现了Runnable
的接口,重写的方法。 -
start
是启动线程的方法 - 在
Thread
类中,调用关系为:start
->start0
->run
->target.run
Thread
类的run
方法源码
public void run() {
if (target != null) {
target.run();
}
}
Thread
类的target
属性
/* What will be run. */
private Runnable target;
target
属性由private void init(ThreadGroup g, Runnable target, String name,long stackSize, AccessControlContext acc)
方法初始化。init
方法在Thread
类的构造方法里被调用
2.匿名内部类对象的构造方法如何调用父类的非默认构造方法
传统定时器技术
API:
例子:一个定时器实现交替2秒、3秒打印
static int count = 0;
public static void main(String[] args) {
class MyTimerTask extends TimerTask{
@Override
public void run() {
System.out.println(Thread.currentThread()+" bomb!");
new Timer().schedule(new MyTimerTask(), 2000+1000*(count++%2));
}
}
//3s后开启定时器
new Timer().schedule(new MyTimerTask(),3000);
}
可以使用quarlz
开源工具
互斥
关键字:synchronized
,检查锁对象
synchronized(this)
synchronized void function(){}
synchronized(A.class)
同步
经验:
要用到共同数据(包括同步锁)或共同算法的若干个方法应该归在同一个类身上,这种设计体现了高聚类和程序的健壮性。
同步互斥不是在线程上实现,而是在线程访问的资源上实现,线程调用资源。
例子: 子线程循环5次,主线程循环10次,如此交替50次
设计:
使用一个Business类来包含子线程和主线程要运行的代码,从而,该类的对象成为加锁的对象。同步互斥在该类实现,由线程调用该类的方法,即调用了资源。
代码:
/**
* Created by brian on 2016/2/4.
*/
public class TraditionalThreadCommunication {
public static void main(String[] args) {
Business business = new Business();
new Thread(
new Runnable() {
@Override
public void run() {
for(int i=1;i<=50;i++){
business.sub(i);
}
}
}
).start();
for(int i=1;i<=50;i++){
business.main(i);
}
}
}
class Business{
private boolean bShouldSub = true;
public synchronized void sub(int i){
while(!bShouldSub){
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
for(int j=1;j<=5;j++){
System.out.println("sub thread count "+j+","+i+"/50");
}
bShouldSub = false;
this.notify();
}
public synchronized void main(int i){
while(bShouldSub){
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
for(int j=1;j<=10;j++){
System.out.println("main thread count "+j+","+i+"/50");
}
bShouldSub = true;
this.notify();
}
}
判断条件时,while与if的区别:while防止伪唤醒
- 黑箱难题阻碍了深度学习的普及与发展
- iOS 转场动画探究(一)
- XCode中如何使用事务
- 如何部署编译NDIS驱动的环境(内部资料)
- 深度学习的入门级装机配置推荐
- Self Host模式下的ASP. NET Web API是如何进行请求的监听与处理的?
- GridView绑定小技
- XCode读取Excel数据(适用于任何数据库)
- ObjectDataSource选择业务对象列表为空的探讨
- ASP.NET Web API自身对CORS的支持: CORS授权检验的实施
- 模版引擎XTemplate与代码生成器XCoder(源码)
- 深度学习让人脸识别准确率不断提升
- 在一个空ASP.NET Web项目上创建一个ASP.NET Web API 2.0应用
- 小论线性变换
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- C++核心准则T.10:为所有的模板参数定义概念
- C语言二级指针用法之模拟句柄用途
- Linux解压缩文件
- C++核心准则T.11:只要可能就使用标准概念
- 给pugjs的stun主题添加canvas时钟
- C++核心准则T.12:声明局部变量类型时,概念比auto更好
- Arch Linux切换rEFInd开机引导程序
- C++核心准则T.13:对于简单的,单类型参数概念,使用缩略记法更好
- VBA编写Ribbon Custom UI编辑器08——实现ZIP的写入
- 用 Python 写个七夕表白神器
- 3分钟短文 | Laravel 用户授权原来内置了这么多方法
- E0144"const char *" 类型的值不能用于初始化 "char *" 类型的实体的三种解决方法
- 数据采集面对JS加密无所适从?善用这3个工具,搞定一大半的JS逆向!
- 点赞功能设计与实现
- [推荐]Linux入门系列(一)换个角度看Linux其实很简单,带你一起入门