面向对象程序设计-Java笔记(8)线程与多线程
时间:2020-04-22
本文章向大家介绍 面向对象程序设计-Java笔记(8)线程与多线程,主要包括 面向对象程序设计-Java笔记(8)线程与多线程使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
线程与多线程
1. 线程
线程:一个线程是进程的一条执行路径,拥有多个线程的进程可以同时完成各种功能。(各个线程彼此独立)
- 多线程并发执行仅在逻辑上同时,事实上,java虚拟机的执行动作在不同的执行空间来回切换,直至所有线程的任务均实现为止。
- 当某一线程在执行时,其他线程均停止。
- java虚拟机只负责main()主线程的启动。
- 只能由java虚拟机决定哪一个线程被执行,但设计程序时可以人为导向一下(仅供虚拟机参考)interrupt、yield、sleep、wait、notify、join等。
如何创建线程对象?
- 继承Thread类
自定义一个继承Thread类的子类,再覆盖Thread类中的run方法。
由于子类仅能继承一个类,此种方法局限性较大,不建议。
class MyThread extends Thread{
@Override
public void run(){
....//待执行的任务
}
}
- 实现Runnable接口
(1)自定义类实现Runnable接口,override run方法;
(2)new自定义类;
(3)利用对象new一个Thread对象。
该种方式更为灵活
/*实现Runnable接口的类的对象可以被Runnable接口定义的变量引用*/
class MyRunnable implements Runnable{
@Override
public void run(){
....//待执行的任务
}
}
MyRunnable XX = new MyRunnable();
Thread MyThread = new Thread(XX);
注意:
- Thread对象在没有调用start()之前只是个普通的对象,调用start()之后才是真正的线程。
- Thread对象不可以被重复使用,不可以再调用start()指定新任务,一旦线程的run()方法完成后,该线程不能再重新启动,留下来的是普通对象。
线程状态:
(1)创建态
(2)就绪态
(3)运行态
(4)阻塞态
(5)消亡态
2. 多线程
-
problem: 多个线程会产生并发性问题(两个以上的线程存取单一对象的数据,不知道自己的数据被另一线程中的程序改变)。
-
思考: 多线程操作时必须同步变量的变化,如何同步变量的变化?synchronized
(1)同步方法(处理变量的方法每次只能被单一线程使用)
(2) 同步一行或数行指令(同步化不可分割的原子单元(此处非常重要),否则,哪怕每一行都加上锁,动作间仍有被插断的可能)。 -
解决方法: 每一个对象都有一对“锁和钥匙”。 上“锁”。
问题来了,锁的是谁?方法、成员变量、线程本身,----锁的是对象。
(1)对象上的锁只会在有同步化的方法上起作用。
(2)一旦某个线程进入该对象的同步化方法A(持有对象的钥匙),其他线程就无法进入该对象上的任何同步化方法,直到方法A结束。
线程状态:
(1)创建态
(2)就绪态
(3)运行态
(4)阻塞态----等待阻塞态、互斥阻塞态
(5)消亡态
原文地址:https://www.cnblogs.com/yuecheng/p/12753044.html
- 微信上线小游戏:对流量基础入口应用商店革命
- Appium Desktop 使用
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(36)-文章发布系统③-kindeditor使用
- Windows Server 2008 R2 下配置证书服务器和HTTPS方式访问网站
- .Net 转战 Android 4.4 日常笔记(7)--apk的打包与反编译
- 丰富的silverlight控件
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(35)-文章发布系统②-构建项目
- .Net 转战 Android 4.4 日常笔记(6)--Android Studio DDMS用法
- 机器学习加密货币IOTA在机构支持下跃起
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(34)-文章发布系统①-简要分析
- WCF技术剖析之六:为什么在基于ASP.NET应用寄宿(Hosting)下配置的BaseAddress无效
- 微信发布了小游戏,这一次腾讯 vs 世界
- .Net 转战 Android 4.4 日常笔记(5)--新软件Android Studio 0.5.8安装与配置及问题解决
- 第2章 对象激活上下文-对象激活
- 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 文档注释