1、Thread类

package com.wjl.base;public class MyThread extends Thread {/*** 利用继承的特点*    将线程名称传递 * @param name*/public MyThread(String name) {super(name);} public void run() {for(int i=0;i<20;i++) {//getName来自父类ThreadSystem.out.println(getName()+"--"+i+"---");}}
}

测试

package com.wjl.test;import com.wjl.base.MyThread;/*** 多线程* @author wjl**/
public class Demo01 {public static void main(String[] args) {/** 多线程执行时,在栈内存中,每个执行线程都有一片自己所属的栈内存空间。* 进行方法的压栈和弹栈。*/MyThread mt=new MyThread("业务1");mt.start();//开启一个新的线程for(int i=0;i<20;i++) {System.out.println("主线程"+"---"+i+"----");}}
}

Thread构造方法:

  • public Thread() 分配一个新的线程对象。
  • public Thread(String name) 分配一个指定名字的新的线程对象。
  • public Thread(Runnable target) 分配一个带有指定目标新的线程对象。
  • public Thread(Runnable target,String name) 分配一个带有指定目标新的线程对象并指定名字

常用方法:

  • public String getName() :获取当前线程名称。
  • public void start() :导致此线程开始执行; Java虚拟机调用此线程的run方法。
  • public void run() :此线程要执行的任务在此处定义代码。
  • public static void sleep(long millis) :使当前正在执行的线程以指定的毫秒数暂停(暂时停止执行)。
  • public static Thread currentThread() :返回对当前正在执行的线程对象的引用。

2、Runnable

public class MyRunnabe implements Runnable {@Overridepublic void run() {for (int i = 0; i < 20; i++) {System.out.println(Thread.currentThread().getName()+"---"+i+"---");}}
}
import com.wjl.base.MyRunnabe;public class Demo02 {public static void main(String[] args) {MyRunnabe mr=new MyRunnabe();//创建线程对象Thread thread=new Thread(mr, "业务2");thread.start();for (int i = 0; i < 20; i++) {System.out.println("主线程"+"---"+i+"----");}}
}

3、Thread和Runnable的区别

如果一个类继承Thread,则不适合资源共享。但是如果实现了Runable接口的话,则很容易的实现资源共享。
总结:
实现Runnable接口比继承Thread类所具有的优势:

  • 适合多个相同的程序代码的线程去共享同一个资源。
  • 可以避免java中的单继承的局限性。
  • 增加程序的健壮性,实现解耦操作,代码可以被多个线程共享,代码和线程独立。
  • 线程池只能放入实现Runable或Callable类线程,不能直接放入继承Thread的类

4、线程同步

4.1 同步代码块

同步代码块: synchronized 关键字可以用于方法中的某个区块中,表示只对这个区块的资源实行互斥访问。
格式:

synchronized(同步锁){需要同步操作的代码
}

同步锁:
对象的同步锁只是一个概念,可以想象为在对象上标记了一个锁.
1. 锁对象 可以是任意类型。
2. 多个线程对象 要使用同一把锁

/*** 同步代码块* @author wjl**/
public class Ticket implements Runnable {private int ticket=100;Object lock=new Object();//执行卖票操作@Overridepublic void run() {while(true) {synchronized (lock) {if(ticket>0) {//有票try {Thread.sleep(100);//模拟出票时间} catch (Exception e) {e.printStackTrace();}//获取当前线程的名字String name=Thread.currentThread().getName();System.out.println(name+" 正在售"+ticket--+"---");}else {break;}}}}}

测试

package com.wjl.test;import com.wjl.ticket.Ticket;public class Demo03Ticket1 {public static void main(String[] args) {Ticket ticket=new Ticket();Thread t1=new Thread(ticket,"窗口1");Thread t2=new Thread(ticket,"窗口2");Thread t3=new Thread(ticket,"窗口3");//同时卖票t1.start();t2.start();t3.start();}
}

4.2 同步方法

同步方法:使用synchronized修饰的方法,就叫做同步方法,保证A线程执行该方法的时候,其他线程只能在方法外等着

public synchronized void method(){可能会产生线程安全问题的代码
}
package com.wjl.ticket;public class Ticket2 implements Runnable {private  int ticketNum=100;@Overridepublic void run() {while(true) {sellTicekt();}}/*** 锁对象 是 谁调用这个方法  就是谁*    隐含 锁对象 就是 this*/public synchronized void sellTicekt() {if(ticketNum>0) {//有票try {Thread.sleep(50);} catch (InterruptedException e) {e.printStackTrace();}//获取当前线程对象的名字String name=Thread.currentThread().getName();System.out.println(name+" 正在售"+ticketNum--+"---");}}}

4.3 Lock锁

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

  • public void lock() :加同步锁。
  • public void unlock() :释放同步锁。
    使用如下
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;public class Ticket3 implements Runnable{private int ticketNum=100;Lock lock=new ReentrantLock();@Overridepublic void run() {while(true) {lock.lock();if(ticketNum>0) {//有票try {Thread.sleep(50);} catch (InterruptedException e) {e.printStackTrace();}//获取当前线程对象的名字String name = Thread.currentThread().getName();System.out.println(name+"正在售"+ticketNum--+"---");}lock.unlock();}}}

5、线程状态

在API中 java.lang.Thread.State 这个枚举中给出了六种线程状态:

java基础—多线程相关推荐

  1. java基础-多线程应用案例展示

    java基础-多线程应用案例展示 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.两只熊,100只蜜蜂,蜜蜂每次生产的蜂蜜量是1,罐子的容量是30,熊在罐子的蜂蜜量达到20的时候 ...

  2. 2020 - [Java基础 +多线程 + 虚拟机] + [计网 + 操作系统] + [MySQL] + [Redis] + [RocketMQ] + [Spring]常见面试题与解析

    前情提要:下面的内容主要由网上的资料和个人的理解整理而成.由于时间仓促可能没有给出相应的链接,并不代表我不尊重他人的劳动成果,后续更新会补上相应的链接.其中内容可能有理解不到位的地方,大家可选择性采纳 ...

  3. Java基础--多线程

    一.程序.进程.线程 1.区别 (1)程序是一段静态的代码,为应用程序执行的蓝本. (2)进程为程序的一次动态执行过程,包括代码的加载.执行以及执行完毕的一个完整过程. (3)线程是进程中的一个执行单 ...

  4. 黑马程序员——java基础---多线程(二)

    ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! -------  线程间的通信:简单来说,就是多个线程在操作同一资源,但操作的动作不同. 试想一下,对于同一个资 ...

  5. java基础------多线程(转)

    24.01_多线程(多线程的引入)(了解) 1.什么是线程 线程是程序执行的一条路径, 一个进程中可以包含多条线程 多线程并发执行可以提高程序的效率, 可以同时完成多项工作 2.多线程的应用场景 红蜘 ...

  6. 10 Java基础 多线程2

    /* 线程间通讯: 其实就是多个线程在操作同一个资源 但是操作的动作不同 */ class Res { Stringname; Stringsex; } class Input implements ...

  7. 黑马程序员——Java基础---多线程

    ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 多线程 一.概述 说起多线程,我们就需要首先来谈谈什么叫做进程.所谓进程,就是在计算机上正在进行 ...

  8. Java基础---多线程宝典

    多线程 文章目录 多线程 核心概念 `Process`与`Thread` 线程三种创建方式 继承`Thread`类 使用多线程实现下载网络图片 实现`Runnable`接口 多线程同时操作同一个对象 ...

  9. 黑马程序员JAVA基础-多线程

    ------- android培训.java培训.期待与您交流! ---------- 线程: 线程是进程中的一个独立的控制单元 线程在控制着进程的执行 一个进程中至少有一个线程 线程的创建 第一种方 ...

最新文章

  1. for...in和 for...of
  2. C++11 开启多线程
  3. 用计算机探索,学生计算机基础的应用探索
  4. __stdcall和__cdecl的区别
  5. 混合多云架构_使用混合多云每个人都应避免的3个陷阱(第3部分)
  6. 浅谈Stein算法求最大公约数(GCD)的原理及简单应用
  7. 自考----怎么说我不爱你
  8. 全能挤房器 v2.1
  9. 【Java基础】使用NumberFormat 、DecimalFormat进行数字格式化
  10. html 获取ie浏览器,用C#从,IE浏览器中获取HTML文档
  11. iOS Swift 照片裁剪
  12. 共识算法-Mencius详解
  13. 【Flutter】利用nfc_manager 读取NFC交通卡信息
  14. 2020秋季校园招聘深信服、噢易云、绿盟面筋
  15. CList 动态链表的学习笔记
  16. 【BUUCTF】[MRCTF2020]套娃
  17. Android 第二春 无缝Harmony 开发
  18. 假如你想成为一名测试工程师(程序员找茬师)
  19. 【高并发专题】-高并发下前后端常用解决方案总结(全套)
  20. 欧姆龙CP1H与三菱E740变频器 485通讯 串口网关与变频器进行modbus RTU通讯。 功能:触摸屏进行参数设置监控,变频器采用三菱E740

热门文章

  1. iOS - 直播总结(理论到实践)
  2. 开源实习经验分享:openEuler软件包加固测试
  3. layui表格数据的批量操作
  4. 霍尼韦尔系统服务器冗余切换,霍尼韦尔PKS系统在聚酯装置的成功应用
  5. 调用转账到支付宝账户的接口后,账户被封禁,如何处理?
  6. No instances available for [user-service] with root cause(Ribbon负载均衡)
  7. 腾讯轻量云服务器控制台详细介绍及建站操作图文教程
  8. 发表一个AARDIO对接中控考勤机的源码
  9. delphi 裁剪mp3_如何在Delphi中读取用于音频处理的MP3文件?[关闭]
  10. PDF怎么转成PPT文件?记下这两种方法轻松化解难题