线程

线程:正在运行的程序,是程序的执行路径;多线性

进程:是应用程序的载体,程序运行在虚拟机中。一个应用软件对应一个进程。

一个进程包含多个线程,一个线程对应一个进程。

好处:提高软件的运行效率

多线程的运行原理

在同一时刻只能有一个线程正在使用CPU,操作系统设计了CPU的调度方式。

  • 分时调用:平均分配使用CPU的使用时间
  • 抢占式调度:根据线程的优先级分配CPU资源

开发多线程的方式

  • 继承Thread类
  • 实现Runnable接口

Thread类

构造方法:

成员方法:
- int getPriority() 返回线程的优先级。
- String getName() 返回该线程的名称。
- void run()运行线程逻辑的代码
- void start()开启线程,使线程处于就绪状态,等待CPU的调度。

线程使用

定义子线程类(继承Thread或者实现Runable接口),重写run()方法。

创建线程对象,调用start()方法。

子线程

public class DemoThread extends Thread {public DemoThread(){}public DemoThread(String name){super(name);}@Overridepublic void run() {Thread demo = Thread.currentThread();String demoName = demo.getName();System.out.println(demoName);}}

主线程

public class DemoMain {public static void main(String[] args) {Thread main = Thread.currentThread();String mainName = main.getName();System.out.println(mainName);//创建子线程的对象DemoThread dt=new DemoThread("我是子线程");dt.start();System.out.println("主线程");}
}

实现Runnable接口

  1. 定义类实现Runnable接口,重写run()方法(线程执行的代码)
  2. 创建子线程任务对象
  3. 创建子线程对象
  4. 调用start()方法。

子线程

public class DemoRunable implements Runnable{@Overridepublic void run() {System.out.println(Thread.currentThread().getName());}}

主线程

public class MainRunnable {public static void main(String[] args) {//创建子任务DemoRunable dr=new DemoRunable();//创建子线程对象Thread td=new Thread(dr,"子线程");td.start();}
}

两种方式的区别

  1. 继承Thread类, 任务与子线程代码 耦合(关联性)到一起。
  2. 实现Runnable接口,把任务代码和子线程的代码分开(解耦性强)
  3. 继承扩展性差、不能继承其他的父类,只能继承一个父类。

线程匿名内部类使用

/***只调用一次线程* @author YandeHu**/
public class DemoInner {public static void main(String[] args) {new Thread(){@Overridepublic void run() {System.out.println(Thread.currentThread().getName());System.out.println("Thread继承子线程匿名内部类的代码");}}.start();Runnable r=new Runnable(){@Overridepublic void run() {System.out.println("Runnable1 匿名自内部对象");}};Thread td=new Thread(r);td.start();new Thread(new Runnable(){@Overridepublic void run() {System.out.println("Runnable2 匿名自内部对象");}}).start();}
}

解决线程不安全的方式

保证修改共享数据的代码在同一时刻只能一个线程访问,保证线程是同步的。

  1. 使用同步代码块

    1. 使用关键字 syncronized 修改共享代码块
    2. 同步:代码一行一行的往下执行
    3. 异步:多个线程同时执行
    4. 锁对象:任意的对象类型 ,只有线程拿到此对象,才能执行代码。

    public class TiketRunnable implements Runnable {

    int tiketNumber=100;
    //锁对象 只有获得锁对象的线程才可以执行
    Object obj=new Object();
    @Override
    public void run() {while(true){synchronized (obj) {if(tiketNumber>0){try {Thread.sleep(50);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}System.out.println("线程"+Thread.currentThread().getName()+" 正在卖"+(tiketNumber--)+"张票");}}}}}
    

Lock接口

Lock lock=new ReentrantLock();//重写run方法
public void run() {lock.lock();同步代码lock.unlock();}

Lock lock=new ReentrantLock();
@Override
public void run() {while(true){lock.lock();if(tiketNumber>0){try {Thread.sleep(50);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}System.out.println("线程"+Thread.currentThread().getName()+" 正在卖"+(tiketNumber--)+"张票");}lock.unlock();}

线程、线程匿名内部类、解决线程不安全的方式相关推荐

  1. 线程安全,线程同步,解决线程同步问题

    一.线程安全问题 如果有多个线程在同时运行,而这些线程可能会同时运行这段代码.程序每次运行结果和单线程运行的结果是一样 的,而且其他的变量的值也和预期的是一样的,就是线程安全的. 简单来说就是多线程访 ...

  2. Java多线程(4)--线程的同步解决线程安全问题

    多线程出现安全问题 问题的原因: 当多条语句在操作同一个线程共享数据时,一个线程对多条语句只执行了一部分,还没有执行完,另一个线程参与进来执行,导致共享数据的错误. 解决办法: 对多条操作共享数据的语 ...

  3. 线程安全问题及解决方法

    一.线程不安全的原因 线程在执行的过程中出现错误的主要原因有以下几种: 1.根本原因 导致线程不安全的所有原因中,最根本的原因是--抢占式执行.因为CPU字在进行线程调度的时候,是随机调度的,而且这是 ...

  4. 如何解决线程安全问题

    如何解决线程安全问题 怎么解决线程的安全问题呢? 基本上所有解决线程安全问题的方式都是采用"序列化临界资源访问"的方式,即在同一时刻只有一个线程操作临界资源,操作完了才能让其他线程 ...

  5. hash是线程安全的吗?怎么解决?_这次进程、线程、多线程和线程安全问题,一次性帮你全解决了...

    1. 什么是进程 一个软件,在操作系统中运行时,我们称其为进程. 进程是操作系统分配资源的最小单元,线程是操作系统调度的最小单元. 2. 什么是线程 在一个进程中,每个独立的功能都需要独立的去运行,这 ...

  6. 【解决线程安全问题:通过Lock锁对象】

    [解决线程安全问题:通过Lock锁对象] 参考文章: (1)[解决线程安全问题:通过Lock锁对象] (2)https://www.cnblogs.com/zuixinxian/p/9570409.h ...

  7. JAVE SE 学习day_09:sleep线程阻塞方法、守护线程、join协调线程同步方法、synchronized关键字解决多线程并发安全问题

    一.sleep线程阻塞方法 static void sleep(long ms) Thread提供的静态方法sleep可以让运行该方法的线程阻塞指定毫秒,超时后线程会自动回到RUNNABLE状态,等待 ...

  8. 【Java 并发编程】线程操作原子性问题 ( 问题业务场景分析 | 使用 synchronized 解决线程原子性问题 )

    文章目录 总结 一.原子性问题示例 二.线程操作原子性问题分析 三.使用 synchronized 解决线程原子性问题 总结 原子操作问题 : 线程中 , 对变量副本 count 进行自增操作 , 不 ...

  9. Java非线程安全问题的解决方法

    非线程安全.非线程安全主要是指多个线程对同一个对象中的同一个实例变量进行操作时会出现值被更改.值不同步的情况,进而影响程序的执行流程.下面用一个示例来学习一下如何解决非线程安全问题. 本案例模拟了多线 ...

最新文章

  1. 2:0!谷歌 AI “AlphaStar“ 虐杀职业星际玩家
  2. NSMutableString和NSString区别,及相互转换方法
  3. leetcode算法题--Remove K Digits
  4. php接受post值报错,php接收post参数时报错怎么办
  5. 从物联网设备生命周期理解Apple Homekit框架
  6. Python计算机视觉:第十章 OpenCV
  7. 水池数目---深搜思想
  8. 【总结】有三AI所有GAN相关学习资料汇总,有图文、视频、代码实战等......
  9. BUG总结——【构造函数写逻辑】引发的极大的线上问题
  10. 【Linux系统编程】线程栈大小
  11. 珠宝条码打印扫描解决方案
  12. 2014/5/25 多校
  13. 国外博客透露JavaFX 2.0路线图
  14. Oracle Concepts Guide 中 Oracle 实例 和 数据库 【关系图】
  15. NYOJ954--N的阶乘的二进制表示最低位的1的位置
  16. 读书笔记-Java完全自学手册
  17. 2018百度seo最新算法大全 青岛墨羽SEO统计
  18. 手机图标ui设计尺寸:ui设计app图标尺寸规范
  19. hibernate复习第(三)天
  20. 西游记不单单讲的是故事(1) ------ 摘自 吴闲云的《煮酒探西游》

热门文章

  1. blktrace 工具集使用 及其实现原理
  2. git 对之前的commit 进行重新签名 Resign
  3. C++的STL 栈 实现四则运算
  4. WEBSHELL恶意代码批量提取清除工具
  5. Buffer的工作方式
  6. adb logcat命令查看并过滤android输出log
  7. 2003網域升級到2008網域以及遷移DNS
  8. Gitlab CI更多内容学习(二)
  9. SLAM之特征匹配(三)————RANSAC------LO-RANSAC Algorithm
  10. PHP APC安装与使用