java 多线程 快速入门
------------恢复内容开始------------
java 多线程 快速入门
1. 进程和线程
什么是进程?
进程是正在运行的程序它是线程的集合
进程中一定有一个主线程
一个操作系统可以有多个线程
什么是线程?
线程就是独立的运行一条执行路径
一个独立的执行单元 , 一个执行流程
为什么要使用多线程?
多线程提高程序效率 , 使用多线程 , 每个线程互补影响
2.创建线程的方式有哪些
1.使用继承 Thread类方式
如下示例

结果

1.继承 Thread 类
class CreateThread_1 extends Thread { /*......*/}
2.重写方法 run()
public void run() {/*......*/}
3.创建对象
CreateThread_1 t1 = new CreateThread_1 ()
4.启动线程
ti.start()
注意 : 如果 是直接 调用 run() 方法的话 它还是 单线程 会 按顺序向下执行
直接调用 run() 方法 的话 也就是一个普通方法
结果会是

2.使用实现 Runnable 接口
如下示例

结果

1.实现Runnable接口
class CreateThread_2 implements Runnable {/*.....*/}
2.实现 run() 方法
public void run() {/*.....*/}
2.启动线程
// 创建对象
CreateThread_2 t1 = new CreateThread_2();
Thread thread = new Thread(t1);
// 调用 start() 方法 启动线程
thread.start();
注意 : Runnable 接口 没有 start()方法
所以我们要用到 Thread 类 的 start() 方法
3.Callable 内部匿名创建
如下示例
匿名 Thread 类

示例 2

结果

匿名内部 创建多线程 比 Thread 类 和 Runnable 接口 更 灵活
多线程常用 api 方法
start() 启动线程
getId() 获取当前线程 id 编号 从0 开始
getName() 获取当前线程名称
例如:


sleep(1000) 休眠 1 秒
stop() 停止线程
currentThread() 获取当前线程对象
(Thread.currentThread().getId() 获取当前线程 id)
Thread(String name)分配一个新的 Thread 对象 并且定义名称
例如 
多线程有几种状态
1.新建
new Thread();
2.准备
调用 start () 方法时 不会马上执行
3.运行
Cpu 开始执行 run 时
4.休眠
调用sleep()方法
或者 wait()方法
5.停止(死亡)
Run 方发执行完毕或者调用 stop()方法
流程图

join ()方法
作用 : 先让别的线程先执行 ( 在当前线程 , 当前线程 让出 )
示例: 让子线程先执行

结果

总结 :
进程是正在运行的程序,它是线程的集合
线程就是在独立运行一条执行路径
多线程 就是为了提高程序的效率
进程是线程集合
线程是进程一条执行路径
Thread 类创建线程
Runnable 接口创建线程
匿名内部创建线程
多线程的常用api方法
多线程的运行状态
------------恢复内容结束------------
java 多线程 快速入门
1. 进程和线程
什么是进程?
进程是正在运行的程序它是线程的集合
进程中一定有一个主线程
一个操作系统可以有多个线程
什么是线程?
线程就是独立的运行一条执行路径
一个独立的执行单元 , 一个执行流程
为什么要使用多线程?
多线程提高程序效率 , 使用多线程 , 每个线程互补影响
2.创建线程的方式有哪些
1.使用继承 Thread类方式
如下示例

结果

1.继承 Thread 类
class CreateThread_1 extends Thread { /*......*/}
2.重写方法 run()
public void run() {/*......*/}
3.创建对象
CreateThread_1 t1 = new CreateThread_1 ()
4.启动线程
ti.start()
注意 : 如果 是直接 调用 run() 方法的话 它还是 单线程 会 按顺序向下执行
直接调用 run() 方法 的话 也就是一个普通方法
结果会是

2.使用实现 Runnable 接口
如下示例

结果

1.实现Runnable接口
class CreateThread_2 implements Runnable {/*.....*/}
2.实现 run() 方法
public void run() {/*.....*/}
2.启动线程
// 创建对象
CreateThread_2 t1 = new CreateThread_2();
Thread thread = new Thread(t1);
// 调用 start() 方法 启动线程
thread.start();
注意 : Runnable 接口 没有 start()方法
所以我们要用到 Thread 类 的 start() 方法
3.Callable 内部匿名创建
如下示例
匿名 Thread 类

示例 2

结果

匿名内部 创建多线程 比 Thread 类 和 Runnable 接口 更 灵活
多线程常用 api 方法
start() 启动线程
getId() 获取当前线程 id 编号 从0 开始
getName() 获取当前线程名称
例如:


sleep(1000) 休眠 1 秒
stop() 停止线程
currentThread() 获取当前线程对象
(Thread.currentThread().getId() 获取当前线程 id)
Thread(String name)分配一个新的 Thread 对象 并且定义名称
例如 
多线程有几种状态
1.新建
new Thread();
2.准备
调用 start () 方法时 不会马上执行
3.运行
Cpu 开始执行 run 时
4.休眠
调用sleep()方法
或者 wait()方法
5.停止(死亡)
Run 方发执行完毕或者调用 stop()方法
流程图

join ()方法
作用 : 先让别的线程先执行 ( 在当前线程 , 当前线程 让出 )
示例: 让子线程先执行

结果

总结 :
进程是正在运行的程序,它是线程的集合
线程就是在独立运行一条执行路径
多线程 就是为了提高程序的效率
进程是线程集合
线程是进程一条执行路径
Thread 类创建线程
Runnable 接口创建线程
匿名内部创建线程
多线程的常用api方法
多线程的运行状态
java 多线程 快速入门的更多相关文章
- java多线程快速入门(六)
多线程应用实例(批量发送短信) 1.创建实体类 package com.cppdy; public class UserEntity { private int id; private String ...
- java多线程快速入门(一)
1.什么是进程 比如:QQ.QQ游戏.eclipse都是进程,可以通过任务管理器查看进程 2.进程和线程区别 线程是进程的一部分,一个进程可以包含多个线程,一个线程只能属于一个进程 进程是所有线程的集 ...
- java多线程快速入门(二十二)
线程池的好处: 避免我们过多的去new线程,new是占资源的(GC主要堆内存) 提高效率 避免浪费资源 提高响应速度 作用:会把之前执行某个线程完毕的线程不会释放掉会留到线程池中给下一个调用的线程直接 ...
- java多线程快速入门(二十一)
CountDownLatch(闭锁)计数器 有一个任务A,它要等待其他4个任务执行完毕之后才执行,此时就可以利用CountDownLatch来实现这种功能 package com.cppdy; imp ...
- java多线程快速入门(二十)
1.Java.util的线程安全工具类 Vector(线程安全) ArrayList(线程不安全) HashTable(线程安全) HashMap(线程不安全) 2.将线程不安全集合变为线程安全集合 ...
- java多线程快速入门(十八)
Lock锁是JDK1.5之后推出的并发包里面的关键字(注意捕获异常,释放锁) Lock与synchronized的区别 Lock锁可以人为的释放锁(相当于汽车中的手动挡) synchronized当线 ...
- java多线程快速入门(十七)
多线程通讯实例(必须要有多个线程.必须要管理同一个变量:线程A生产一个变量,线程B消费一个变量) package com.cppdy; class User { public String usern ...
- java多线程快速入门(十五)
使用violate关键字解决了变量的可见性问题(volatile让多线程刷新falg的值) package com.cppdy; class MyThread11 extends Thread { / ...
- java多线程快速入门(十四)
使用atomicInteger解决了原子性问题(AtomicInteger保证每次只能一个线程操作count) package com.cppdy; import java.util.concurre ...
随机推荐
- uva 11806 Cheerleaders (容斥)
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&p ...
- H3C路由器Telnet服务配置命令
- oracle用Where子句替换HAVING子句
避免使用HAVING子句, HAVING 只会在检索出所有记录之后才对结果集进行过滤. 这个处理需要排序,总计等操作. 如果能通过WHERE子句限制记录的数目,那就能减少这方面的开销. 例如: 低效: ...
- 带你进入 Activiti 工作流的世界
Activiti 是一个针对企业用户.开发人员 .系统管理员的轻量级工作流业务管理平台,其核心是使用 java 开发的快速 . 稳定的 BPMN2.0 流程引擎 .它可以与 spring 完美集成. ...
- JS遍历数组
for 如果用var会造成变量声明提前等问题for(var i = 1; i <= arr.length; i++){ console.log(arr[i - 1]);} for(let i = ...
- Codeforces Round #186 (Div. 2)
A. Ilya and Bank Account 模拟. B. Ilya and Queries 前缀和. C. Ilya and Matrix 考虑每个元素的贡献. 边长为\(2^n\)时,贡献为最 ...
- [转]【转】大型高性能ASP.NET系统架构设计
大型高性能ASP.NET系统架构设计 大型动态应用系统平台主要是针对于大流量.高并发网站建立的底层系统架构.大型网站的运行需要一个可靠.安全.可扩展.易维护的应用系统平台做为支撑,以保证网站应用的平稳 ...
- windows常用命令行命令
https://blog.csdn.net/qq_32451373/article/details/77743869 打开"运行"对话框(Win+R),输入cmd,打开控制台命令窗 ...
- linux 编译模块
第一步, 我们需要看一下模块如何必须被建立. 模块的建立过程与用户空间的应用程序的 建立过程有显著不同; 内核是一个大的, 独立的程序, 对于它的各个部分如何组合在一起 有详细的明确的要求. 建立过程 ...
- Codeforces Round #561 (Div. 2)
C. A Tale of Two Lands 题意: 给出 n 个数,问有多少点对(x,y)满足 |x-y| ≤ |x|,|y| ≤ |x+y|: (x,y) 和 (y,x) 表示一种答案: 题解: ...