Java多线程的使用,一篇文章带你理解多线程,手把手的代码实现案例

注意点:



继承方式实现多线程代码示例:


package com.ykx.java;

/**

  • @author yangkx

  • @create 2022-01-24 17:42

*/

public class HelloWorld {

public static void main(String[] args) {

MyThread t = new MyThread();

t.start();

for(int i = 0; i < 100; i++)

if(i % 2 != 0)

System.out.println(i+“=====main”);

}

}

class MyThread extends Thread{

@Override

public void run() {

for(int i = 0; i < 100; i++)

if(i % 2 == 0)

System.out.println(i);

}

}


线程的常用方法

=======

==========================================================================================================================================


线程的调度

=====

======================================================================


线程的优先级

======

 

===========================================================================================================================================


补充:线程的分类

=========


创建多线程的方式二

=========

======================================================================

实现方式实现多线程代码示例:


public class ThreadDemo {

public static void main(String[] args) {

//③创建该类的对象

MThread mThread = new MThread();

//④将此对象作为参数,传递到Thread构造器中,创建对象

Thread thread = new Thread(mThread);

//⑤调用start()方法

thread.start();

}

}

//①类实现Runnable接口

class MThread implements Runnable{

//重写run方法

@Override

public void run() {

for(int i = 0 ; i < 100; i++)

if(i % 2 == 0 )

System.out.println(i);

}

}

两种实现多线程方式的比较

=============


线程的生命周期

=======

 

===========================================================================================================================================


线程的同步

=====

问题的提出



案例分析:火车站售票


模拟火车站售票,开启三个窗口售票

理想状态

极端状态

问题分析

Synchronized的使用方法


分析同步原理:

同步机制中的锁

同步的范围

释放锁的操作

不会释放锁的操作


方式一:同步代码块



继承方式的线程同步处理

代码实现:

package com.ykx.java;

/**

  • @author: yangkx

  • @Title: WindowTest

  • @ProjectName: JavaSenior

  • @Description:

  • @date: 2022/1/27 15:57

  • 同步代码块处理继承方式的多线程

*/

public class WindowTest1 {

public static void main(String[] args) {

Window1 window1 = new Window1();

Window1 window2 = new Window1();

Window1 window3 = new Window1();

window1.setName(“窗口一”);

window2.setName(“窗口二”);

window3.setName(“窗口三”);

window1.start();

window2.start();

window3.start();

}

}

class Window1 extends Thread {

private static int ticket = 20;

@Override

public void run() {

while (true) {

synchronized (Window1.class) {

if (ticket > 0) {

try {

Thread.sleep(100);

} catch (InterruptedException e) {

e.printStackTrace();

}

System.out.println(Thread.currentThread().getName() + “:售票 号:” + ticket);

ticket–;

} else {

break;

}

}

}

}

}

实现方式的线程同步处理

代码实现:

package com.ykx.java;

/**

  • @author: yangkx

  • @Title: WindowTest2

  • @ProjectName: JavaSenior

  • @Description:

  • @date: 2022/1/27 16:57

  • 同步代码块处理实现方式的多线程

*/

public class WindowTest2 {

public static void main(String[] args) {

Window2 window2 = new Window2();

Thread thread1 = new Thread(window2);

Thread thread2 = new Thread(window2);

Thread thread3 = new Thread(window2);

thread1.setName(“窗口一”);

thread2.setName(“窗口二”);

thread3.setName(“窗口三”);

thread1.start();

thread2.start();

thread3.start();

}

}

class Window2 implements Runnable {

private static int ticket = 20;

@Override

public void run() {

while (true) {

synchronized (this) {

if (ticket > 0) {

try {

Thread.sleep(100);

} catch (InterruptedException e) {

e.printStackTrace();

}

System.out.println(Thread.currentThread().getName() + “:售票 号:” + ticket);

ticket–;

} else {

break;

}

}

}

}

}

方式二:同步方法


实现方式的线程同步处理

方法:

例子:

代码实现:

package com.ykx.java;

/**

  • @author: yangkx

  • @Title: WindowTest3

  • @ProjectName: JavaSenior

  • @Description:

  • @date: 2022/1/27 16:57

  • 同步方法处理实现方式的多线程

*/

public class WindowTest3 {

public static void main(String[] args) {

Window3 window3 = new Window3();

Thread thread1 = new Thread(window3);

Thread thread2 = new Thread(window3);

Thread thread3 = new Thread(window3);

thread1.setName(“窗口一”);

thread2.setName(“窗口二”);

thread3.setName(“窗口三”);

thread1.start();

thread2.start();

thread3.start();

}

}

class Window3 implements Runnable {

private static int ticket = 20;

@Override

public void run() {

while (true) {

if(ticket > 0)

show();

else break;

}

}

private synchronized void show(){

if (ticket > 0) {

try {

Thread.sleep(100);

} catch (InterruptedException e) {

e.printStackTrace();

}

System.out.println(Thread.currentThread().getName() + “:售票 号:” + ticket);

ticket–;

}

}

}

继承方式的线程同步处理

因为继承方式造了多个不同对象,所以this是不一样的。加上static后同步监视器是class

代码实现:

package com.ykx.java;

/**

  • @author: yangkx

  • @Title: WindowTest4

  • @ProjectName: JavaSenior

  • @Description:

  • @date: 2022/1/27 16:58

  • 同步方法处理继承方式的多线程

*/

public class WindowTest4 {

public static void main(String[] args) {

Window4 window1 = new Window4();

Window4 window2 = new Window4();

Window4 window3 = new Window4();

window1.setName(“窗口一”);

window2.setName(“窗口二”);

window3.setName(“窗口三”);

window1.start();

window2.start();

window3.start();

}

}

class Window4 extends Thread{

private static int ticket = 20;

@Override

public void run() {

while(true){

if(ticket > 0)

show();

else break;

}

}

private static synchronized void show(){

if (ticket > 0) {

try {

Thread.sleep(100);

} catch (InterruptedException e) {

e.printStackTrace();

}

System.out.println(Thread.currentThread().getName() + “:售票 号:” + ticket);

ticket–;

}

}

}

同步方法的总结

线程安全的单例懒汉式



线程的死锁问题

========

方法三:Lock锁



 

synchronized 与 Lock 的对比



线程的通信

=====

wait() 与 notify() 和 notifyAll()



sleep()和wait()


线程通信的经典案例:


 


 


创建多线程的方式三

=========

实现Callable接口


最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Java开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

 


创建多线程的方式三

=========

实现Callable接口


最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

[外链图片转存中…(img-yBm2BQWw-1715730471076)]

[外链图片转存中…(img-D9XRG9Ec-1715730471076)]

[外链图片转存中…(img-2Y6eKmra-1715730471077)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Java开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

  • 22
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值