学习线程 先了解 线程与进程之间的关系

线程:

 (线程是cpu调度的最小单位)

我们可以说是进程中执行运算的最小单位。

进程:

(进程是资源分配的最小单位)

我们可以说是一段程序执行的过程,

如果还是不清楚2着的话可以打一个比喻 进程 相当于火车, 线程就是火车的没一个车厢.

-----------------------------------------------------------------------------------------------------------------------------------------------

创建线程

Java 提供了三种创建线程的方法:

  • 通过实现 Runnable 接口;
  • 通过继承 Thread 类本身;
  • 通过 Callable 和 Future 创建线程。

1 实现Runnable 的接口

步骤 1.1 建立Runnable 对象

1.2 使用参数为Runnable 对象的构造方法创建Thread实例

1.3 调用start方法启动线程

一个小demo

package me;
public class Main{public static void main(String[] args){Thread thread = new Thread(new Task());thread.start();}static class Task implements Runnable{@Overridepublic void run() {for (int i=0;i<5;i++){System.out.println(i);try {Thread.sleep(1500);} catch (InterruptedException e) {e.printStackTrace();}}}}}

这个就是创建了一个类Task实现Runnable , 最后创建Thread 然后关联类Task

2 继承Thread类

package me;public class Th extends Thread{public static void main(String[] args){Test test = new Test();test.start();}static class Test extends Thread{@Overridepublic void run() {for (int i=0;i<10;i++){System.out.println(i);try {Thread.sleep(1500);} catch (InterruptedException e) {e.printStackTrace();}}}}}

因为Test 继承了Thread 所以这里没有在new Thread,

3 通过 Callable 和 Future 创建线程。

package me;
import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;
public class Main implements Callable<Integer> {public static void main(String[] args) {Main main = new Main();FutureTask<Integer > futureTask = new FutureTask<>(main);Thread thread = new Thread(futureTask);thread.start();}@Overridepublic Integer call() throws Exception {int i = 0;for (; i < 5; i++) {System.out.println(i);Thread.sleep(1500);}return i;}}

线程的生命周期

这个出生就是创建状态, 就绪状态, 执行状态,等待状态,死亡状态,休眠,阻塞状态

有时候我们看别的地方说5中,6中7中, 其实是吧休眠和阻塞当做一种了,  这个自己心里知道就行,

不过各个状态还是需要知道

线程的操作方法

1 线程休眠

调用sleep()方法

例如Thread.sleep(2000) 等待2秒

2 线程加入

当某个线程使用join()方法加入到另一个线程时,另一个线程等待该线程执行完毕以后在继续执行

3 线程礼让

使用yield()方法

yield 方法是具有同样优先级的线程进入可执行状态的机会,

4 中断线程

以前使用stop 不过这个方法已经过时了

现在提倡使用在run()方法里面使用无线循环形式,然后使用一个布尔型标记控制循环停止

如果线程使用了sleep()或wait()方法进入就绪状态,可以使用Thread类中的interrupt()方法是线程离开run()方法,同时线程结束

会抛出异常,用户可以处理该异常时完成线程的中断业务处理

线程同步与异步

线程同步使用 Synchronized 关键字 ,

同步可以比喻成大家排队上公交, 异步就是一起上没有顺序

异步的一个demo

package me;
public class Main  {public static void main(String[] args) {Main demo = new Main();//创建2个线程new Thread(){@Overridepublic void run() {while (true){demo.setName("张三");}}}.start();new Thread(){@Overridepublic void run() {while (true){demo.setName("李四");}}}.start();}public void setName(String str){for ( int i=0;i<str.length();i++){System.out.print(str.charAt(i));}System.out.println();}}

.

并没有顺序

同步 demo

package me;import com.sun.source.tree.SynchronizedTree;public class Main  {public static void main(String[] args) {Main demo = new Main();//创建2个线程new Thread(){@Overridepublic void run() {while (true){demo.setName("张三");}}}.start();new Thread(){@Overridepublic void run() {while (true){demo.setName("李四");}}}.start();}public  void setName(String str){synchronized (this){for ( int i=0;i<str.length();i++){System.out.print(str.charAt(i));}System.out.println();}}}

当然我们还可以使用lock()方法来实现同步效果

package me;import com.sun.source.tree.SynchronizedTree;import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;public class Main {Lock lock = new ReentrantLock();public static void main(String[] args) {Main demo = new Main();//创建2个线程new Thread() {@Overridepublic void run() {while (true) {demo.setName("张三");}}}.start();new Thread() {@Overridepublic void run() {while (true) {demo.setName("李四");}}}.start();}public void setName(String str) {lock.lock();//加锁try{for (int i = 0; i < str.length(); i++) {System.out.print(str.charAt(i));}System.out.println();}finally {lock.unlock();//解锁}}}

使用lock 记得使用try 方法不然要发生异常了, 就没法解锁了 ,try 方法可以很好的处理

lock 是jdk  1.5之后出现的非常好用

线程死锁

有时候2个或者多个线程需要在几个共享对象上获取锁,可能会导致死锁

一般我们是使用synchronized不当的时候就是引起死锁

一个死锁的案例

    public void add(int[] a1,int[]a2){int value = 0;int size = a1.length;if (size == a2.length){synchronized (a1){synchronized (a2){for (int i=0;i<size;i++){value =a1[i]+a2[i];}}}System.out.println(value);}}

避免死锁

尽量避免在同一把锁的代码中用到另一把锁资源,还尽量避免使用全局对象

我们也可以使用资源排序的技术  就是A和B , B必须获得A上的锁然后才能获取B上的锁,一旦A获取A上的锁线程B 必须等待A上的锁

总结下线程上使用的方法

.wait() //当前线程挂起
.notify()// 唤醒正在排队等待同步资源的线程中优先级最高者结束等待
.notifyAll()//  唤醒正在排队等待资源的所有线程结束
 
Thread.sleep(); //线程休眠
Thread.yield()//暂停当前线程的执行,让具有同样优先级的线程进入可执行状态的机会
.start()  //线程开始

Java 线程 知识相关推荐

  1. Java线程知识整理汇总

    优先级 priority 所有线程都有优先级属性 priority,值比较大的会被优先执行 priority 最小值是 1,最大值是 10,默认值是 5 子线程 priority 的初始值跟父线程的 ...

  2. java线程知识体系

    1 java多线程基础概念 2 java线程生命周期 3 线程三种创建方式与线程池的应用 4 多线程的安全问题的解决与死锁 5 java synchronized静态同步方法与非静态同步方法,同步语句 ...

  3. java线程知识梳理_Java多线程——多线程相关知识的逻辑关系梳理

    1 学习多线程知识的根本目标 多线程知识的根本目标是:设计稳健的并发程序. 当然,本文无法回答这个实践性很强的问题(这与具体的业务相关,涉及到具体的策略),本文主要阐述相关知识之间的关系,希望初学者不 ...

  4. java线程知识总结

    (1)线程的状态以及互相转换 NEW,RUNNABLE,WAITING,TIMED_WAITING,BLOCKED,TERMINATED new  Thread()  ----NEW 准备就绪,等到c ...

  5. Java线程知识梳理

    Thread 自定义线程类继承Thread类 重写run()方法,编写线程执行体 创建线程对象,调用start()方法启动线程 线程不一定立即执行,CPU安排调度 多线程图片下载 package Th ...

  6. Java线程知识你还记得多少?

    /   今日科技快讯   / 近日发布的<2021年企业年终奖发放计划调研报告>显示,2021年年终奖的人均水平为2.3万元, 2021年企业年终奖额度相当于员工2.1倍月薪.41%的企业 ...

  7. java线程知识初级

    线程 1.基本概念 多线程是实现并发机制的一种有效手段.进程和线程一样,都是实现并发的一个基本单位.线程是比进程更小的执行单位,线程是进程的基础之上进行进一步的划分.所谓多线程是指一个进程在执行过程中 ...

  8. 技术理论-【Thread】- java线程知识总结

    概念: 背景 程序,进程,线程,多任务,主线程 三高应用(高可用,高性能,高并发) 学习理论(守破离,断舍离), lambda(JDK8,内部类<静态,局部,匿名,lambda>,函数式编 ...

  9. Java并发知识梳理(上):并发优缺点,线程状态转换,Java内存模型,Synchronized,Volatile,final,并发三特性,Lock与AQS,ReetrandLock

    努力的意义,就是,在以后的日子里,放眼望去全是自己喜欢的人和事! 整个系列文章为Java并发专题,一是自己的兴趣,二是,这部分在实际理解上很有难度,另外在面试过程中也是经常被问到.所以在学习过程中,记 ...

最新文章

  1. python培训好学吗-开平北大青鸟:Python培训怎么选?Python好学吗?
  2. Web 探索之旅 | 第二部分第一课:客户端语言
  3. [已解决]window下Can't connect to MySQL server on 'localhost' (10061)与无法启动MYSQL服务”1067 进程意外终止”...
  4. erlang进程的调度效率
  5. 《嵌入式系统数字视频处理权威指南》——第1章 现实世界中的视频
  6. java super是什么意思_java中Super到底是什么意思?必须举例说明!
  7. 【Cocos2D-X 】初窥门径(9)播放音乐/音效
  8. 说不尽的洒脱:不义而富且贵,于我如浮云
  9. 9008刷机模式写入超时刷机帮_高通9008模式刷机,让小米刷机不再畏惧
  10. python中怎么压缩文件_使用Python实现文件压缩和解压
  11. 【jzoj5335】早苗
  12. mac中实用的录音软件有哪些?
  13. windows 8 Surface 会成功吗?
  14. POI和EasyExcel操作Excel
  15. 字节跳动(上海抖音)面经
  16. 极点突然中文标点变全角了
  17. MosFET/FinFET/GAFET ——鳍式晶体管还能走多远
  18. paraview管道:PipeLine
  19. Java学习方法和经验分享,小白看过来
  20. 数据挖掘在客户关系管理中的运用

热门文章

  1. Go 知识点(01)— 主协程与子协程执行顺序
  2. 遇事不责怪别人,换位思考能成全更好的自己
  3. debian 10 静态ip配置
  4. lightgbm 决策树 可视化 graphviz
  5. 学习,思维三部曲:WHAT、HOW、WHY
  6. Linux架构思维导图
  7. 2021年大数据Spark(二十五):SparkSQL的RDD、DF、DS相关操作
  8. (14)某工业生产部门根据国家计划的安排, 拟将某种高效率的5台机器,分配给所属的3个工厂A,B,C,各工厂在获得这种机器后,可以为国家盈利的情况如表4-10所示。
  9. Collections.addAll() 的使用 以及和list.addAll() 的区别
  10. ViewPager 实现界面加载不同的数据