线程 ,多线程, 单线程

  • 进程:是指一个内存中运行的应用程序,每个进程都有一个独立的内存空间,一个应用程序可以同时运行多个进程;进程也是程序的一次执行过程,是系统运行程序的基本单位;系统运行一个程序即是一个进程从创建、运行到消亡的过程。

  • 线程:是进程中的一个执行单元,负责当前进程中程序的执行,一个进程中至少有一个线程。一个进程中是可以有多个线程的,这个应用程序也可以称之为多线程程序。

package day17.demo01;
//线程创建public class Test01 {public static void main(String[] args) {SubThread st = new SubThread();//st.setName("张记");st.start();Thread t = Thread.currentThread();for (int i = 0; i < 50; i++) {System.out.println(t.getName()+"..."+i);}}}

Thread 类

Java使用java.lang.Thread类代表线程,所有的线程对象都必须是Thread类或其子类的实例。每个线程的作用是完成一定的任务,实际上就是执行一段程序流即一段顺序执行的代码。Java使用线程执行体来代表这段程序流。Java中通过继承Thread类来创建启动多线程的步骤如下:

  1. 定义Thread类的子类,并重写该类的run()方法,该run()方法的方法体就代表了线程需要完成的任务,因此把run()方法称为线程执行体。

  2. 创建Thread子类的实例,即创建了线程对象

  3. 调用线程对象的start()方法来启动该线程

package day17.demo01;
/*
* join方法是让 当前线程等待,
* 调用方法的线程进行插队先执行,
* 执行完毕后,在让当前线程执行.
* 对其他线程没有任何影响.
* 注意 此处的当前线程不是调用方法的线程
* 而是Thread.currentThread().
*
* */
public class Test06 {public static void main(String[] args) throws InterruptedException {Thread t1 = new Thread(new Runnable() {     //t1线程@Overridepublic void run() {for (int i = 0; i < 10; i++) {System.out.println("t1 "+i);}}});Thread t2 = new Thread(new Runnable() {     // t2线程@Overridepublic void run() {for (int i = 0; i < 10; i++) {System.out.println("t2 "+i);}}});t1.start();//t1.join();//t1插队加入  主线程等待 t1执行完毕之后main和  t2 抢执行t2.start();t1.join();//t1插队加入  主线程等待  t1 和  t2 抢执行  之后执行 main方法for (int i = 0; i < 10; i++) {System.out.println("main  "+i);    //主线程执行}}
}
package day17.demo01;
//匿名内部类 开启子类对象
public class Test03 {public static void main(String[] args) {//  Thread 类的子类对象Thread t = new Thread(){@Overridepublic void run() {System.out.println("11");}};          //匿名内部类t.start();new Thread(){@Overridepublic void run() {System.out.println("22");}}.start();Runnable r = new Runnable() {@Overridepublic void run() {System.out.println("33");}
};
new Thread(r).start();}
}

线程安全问题

package day17.demo01;public class SellTickets implements Runnable {private int i = 100;@Overridepublic void run() {while (true) {synchronized (this) {if (i > 0) {try {Thread.sleep(10);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName() + "----" + i);i--;} else {break;}}}}}
package day17.demo01;public class Sellticket {public static  void main(String[] args) {SellTickets st = new SellTickets();Thread t1 = new Thread(st);Thread t2 = new Thread(st);Thread t3 = new Thread(st);t1.start();t2.start();t3.start();}
}

java.util.concurrent.locks.Lock机制提供了比synchronized代码块和synchronized方法更广泛的锁定操作,同步代码块/同步方法具有的功能Lock都有,除此之外更强大,更体现面向对象。

Lock锁也称同步锁,加锁与释放锁方法化了,如下:

  • public void lock():加锁。

  • public void unlock():释放锁。

package day17.demo03.demo01;
// 加锁   线程安全public class SellTickets implements Runnable {private int i = 100;@Overridepublic void run() {while (true) {sell();      //调用方法 sell}}public void sell(){synchronized (this){if( i > 0){try {Thread.sleep(10);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName() + "卖票了--" + i);i--;}}}
//    public void sell2(){
//        synchronized (this){
//            if( i > 0){
//                try {
//                    Thread.sleep(10);
//                } catch (InterruptedException e) {
//                    e.printStackTrace();
//                }
//                System.out.println(Thread.currentThread().getName() + "卖票了--" + i);
//                i--;
//            }
//        }}
}
package day17.demo03.demo01;public class Sellticket {public static  void main(String[] args) {SellTickets st = new SellTickets();Thread t1 = new Thread(st);Thread t2 = new Thread(st);Thread t3 = new Thread(st);t1.start();t2.start();t3.start();}
}

Sleep  方法(睡眠)

public static void sleep(long time) 让当前线程进入到睡眠状态,到毫秒后自动醒来继续执行

public class Test{public static void main(String[] args){for(int i = 1;i<=5;i++){Thread.sleep(1000);System.out.println(i)   } }
}

这时我们发现主线程执行到sleep方法会休眠1秒后再继续执行。


学习需要徐徐渐进,今日学会关于多线程的与原理, 创建, 运用 ,表达.

持之以恒,量变引起质变,唯有勤奋可以弥补差距相关推荐

  1. 关于“量变”和“质变”的圣贤语录与辩证思考

    中国圣贤:天下大事必作于细,天下难事必作于易. 合抱之木,生于毫末:九层之台,起于累土:千里之行,始于足下. 不积跬步,无以至千里.不积小流,无以成江海. 夫风生于地,起于青苹之末.风起于青萍之末,浪 ...

  2. 从量变到质变,新华三不求最大但求最强

    算力,早已成为了全行业数字化转型的核心支撑力. 作为全球半导体需求大国,中国市场一直备受业界关注.在中国抗击疫情取得阶段性成果的当下,更具吸引力. 来自联合国贸易和发展会议10月27日发布的报告显示, ...

  3. guid会不会重复_最笨的方法也许是最快的方法,量变到质变,首先要做的是不断重复...

    北宋文学家曾写过这样一则故事. 陈尧咨善于射箭,号称"当世无双",他也很以之自豪,能够八九不离十,实在也算可以的了. 但是有一个普普通通的卖油翁,闲着没事,眯起眼睛,似看非看,毫不 ...

  4. 【英语系列一】—量变到质变亲体验

    英语这个事情,之前在自己心中真的是一个非常大的坎儿,也一直想在英语中有更多的提升,对于坚持的话,稍微有一些动力我就可以坚持一段时间,后来才发现这样坚持的学习并不是长久的~     不过之前也有过类似的 ...

  5. 无代码开发平台,量变到质变的飞跃

    近年来,无代码开发和低代码开发都是软件行业的热门话题.无代码开发允许用户无需编写代码就可以快速构建应用程序,而低代码允许开发人员通过编写少量代码来快速构建应用程序.这两种方法已经逐渐发展起来,可以支持 ...

  6. 从量变到质变——AMD打“翻身仗”的秘诀

    哲学上有句名言,叫"量变引发质变",意思是,任何一个微小的量经过不断的积累,都有可能带来本质上的不同.如今,用这样一句名言来诠释AMD十分恰当,AMD最近公布了2013年第三季度财 ...

  7. c语言质变量变,从量变到质变------------学习的必由之路

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 说起<windows程序设计>(Charles Petzold)第5版,全世界人们都知道,这本书是很好的,也知道是很繁杂的,没有人能在短时间内 ...

  8. 小白程序员怎么由量变到质变写出高质量代码

    小白程序员怎么由量变到质变写出高质量代码?很多老程序员从事开发多年,有这样一种感觉,查看一些开源项目,如Spring.Apache Common等源码是一件赏心悦目的事情,究其原因,无外两点: 1.代 ...

  9. 龙志勇:云游戏的量变与质变 | WISE2022峰会演讲实录

    元宇宙和游戏,可以被看做是虚拟世界的不同应用领域.在Web3.0概念大行其道之前,元宇宙偏向于交互与协同,而游戏更注重用户的感官体验.当各个行业开始讨论下一个互联网时代究竟何为主流时,"虚实 ...

最新文章

  1. uicontrol图形对象用户界面的用法
  2. (8)JMP FAR段间跳转
  3. 虚拟主机上传SQLServer数据库--不完全资料
  4. jsp开发环境的搭建
  5. python zip()函数的理解与应用
  6. c++文件流读取一行_「软帝学院」Java挑战者专栏:IO流详解2
  7. 转(HP大中华区总裁孙振耀退休感言)
  8. C# Winform DataGridview 实现行号倒序
  9. Lodop设置打印维护返回打印语句代码
  10. 清华大学操作系统OS学习(六)——进程和线程
  11. 缺失值了解与简单处理
  12. 计算机网络安全技术实验教程,网络安全实验教程
  13. Js获取屏幕宽度、高度 移动端H5适配
  14. 51单片机步进电机c语言程序,51单片机的步进电机c语言驱动程序
  15. 2021-08-01 武大账号访问知网
  16. 16部趣味数学纪录片
  17. 全球最顶级的十大创新公司
  18. 使用wbadmin备份整个网络上的完整Vista PC
  19. 汇编语言-jcxz指令
  20. linux文件系统lv是什么意思,Linux LVM系列(二)lv缩容

热门文章

  1. 逻辑思维在编程中的重要性!!!(回答问题有感)
  2. 前端小白的html+css入门笔记
  3. Python使用Moviepy将图像序列转换为视频
  4. c语言用CRC校验FCS序列,CRC校验原理与其C语言实现
  5. 通过vi服务器运行vi,动态改变界面改变VI的属性KCC.ppt
  6. DApp生死局 | 路往何方?
  7. 前端vue面试总结,常见的,没有更全,只有更细,更新中
  8. 出现import xx.xx.xx cannot be resolved的问题
  9. 模板学堂丨禅道业务数据分析大屏
  10. 窄带物联网,开启万物互联新篇章