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 ...
随机推荐
- 命名分组(?<name>....)
捕获组分为: 普通捕获组(Expression) 命名捕获组(?Expression) 普通捕获组 从正则表达式左侧开始,每出现一个左括号"("记做一个分组,分组编号从 1 开始. ...
- oracle函数 log(x,y)
[功能]返回以x为底的y的对数 [参数]x,y,数字型表达式, [条件]x,y都必须大于0 [返回]数字 [示例] select power(4,2),log(16,2),1/log(16,4) fr ...
- @noi.ac - 490@ game
目录 @description@ @solution@ @accepted code@ @details@ @description@ 小 Q 和小 T 正在玩一种双人游戏.m 张木牌从左往右排成一排 ...
- 如何用JS和HTML 做一个桌面炒股小插件【原创】
首先,使用node-webkit 做环境,废话不多说,直接贴HTML <!DOCTYPE html> <html xmlns="http://www.w3.org/1999 ...
- eclipse maven项目导出所使用的jar包
在eclipse中定位到maven项目的pom.xml文件右击pom.xml文件,选择Run As-->Maven build…在打开的页面中,GOLAS栏输入“dependency:copy- ...
- call_user_func_array() 内置函数
func_get_args()方法是获取当前文件所有的函数参数 fun_num_args()这个方法是获取方法实参个数 call_user_func_array()这个方法是内置函数,可以直接调用函数 ...
- oracle sum()聚合函数
原文链接:https://blog.csdn.net/cizatu5130/article/details/100291347 oracle sum()聚合函数 2016-05-13 20:08:00 ...
- 第三次脱发——Scurm学(ctrl)习(C)心得
Scrum 学习心得: 首先,敏捷并不是一门具体的技术,而是一种理念或者说是一种思想.它可以指导我们更加高效的开发. 其次,敏捷开发都具有以下共同的特征: 迭代式开发 增量交付 开发团队和用户反馈推动 ...
- 【原生JS】自动渐变轮播
渐变主要是通过CSS3的动画实现. 只需给css中添加transtion动画时间加上JS设置指定图片透明度显示与消失即可实现渐变过程. 效果图: HTML: <!DOCTYPE html> ...
- Codeforces Round #174 (Div. 1 + Div. 2)
A. Cows and Primitive Roots 暴力. B. Cows and Poker Game 模拟. C. Cows and Sequence 线段树维护. D. Cow Progra ...