JavaSenior多线程

JavaSenior多线程

1、方式一:继承于Thread创建线程的步骤:
1.创建一个继承于Thread类的子类
2.重写Thread类的run()
3.创建Thread类的子类对象
4.通过此对象调用start()
多线程运行实例:
在这里插入图片描述
创建Thread类的匿名子类的方式
Thread中的常用方法:
1、currentThread()静态方法:返回执行当前代码的线程
2、getName():获取当前线程的名字
3、setName():设置当前线程的名字
4、yield():释放当前线程的执行权,但是有可能下一刻又分配到该线程
5、join():在线程A中调用线程B的join()方法,此时线程A进入阻塞状态,直到线程B完全执行后,线程A才结束阻塞状态。
6、stop():已过时。当执行此方法时,强制结束当前线程。
7、sleep(long millitime):让当前线程"睡眠"指定的毫秒。在指定的毫秒内当前线程处于阻塞状态。
8、isAlive():判断当前线程是否存活。
创建多线程的方式二 :实现Runnable接口的方式
1.创建一个实现Runnable接口的类
2.实现类去实现Runnable中的抽象方法:run()
3.创建实现类的对象
4.将此对象作为参数传递到Thread类的构造器中,创建Thread类的对象
5.通过Thread类的对象调用start()方法
相比于继承于Thread的优点:
1、实现方式没有类的单继承性的局限性。
2、实现方式更适合来处理多个线程有共享数据的情况。
单例模式之饿汉式:

class Bank{
	private Bank(){
	}
	private static Bank instance = new Bank();
	private static Bank getInstance(){
	return instance;
	}
}

创建多线程的方式三:实现Callable接口的方式
1、创建一个实现Callable的实现类
2、实现call()方法,将此线程需要执行的操作声明在call()中
3、创建Callable接口实现类的对象
4、将此Callable接口实现类的对象作为传递到FutureTask构造器中,创建FutureTask的对象
5、将FutureTask的对象作为参数传递到Thread类的构造器中,创建Thread对象,并调用start()
6、获取Callable中call的返回值
创建多线程的方式四:使用线程池
1、提供指定数量的线程池ExecutorService
2、执行指定线程的操作。需要提供实现Runnable接口或者Callable接口实现类的对象.execute(适合用于Runnable) submit(适合用于Callable)
3、关闭线程池 shutdown()
单例模式之懒汉式:
懒汉式线程不安全

class Bank{
private Bank(){
}
private static Bank instance = null;
public static Bank genInstance(){
if(instance == null){
instance = new Bank();
return instance;
}

二、线程安全问题

一、同步代码块
synchronized(同步监视器){
需要被同步的代码
}
说明:1、操作共享数据的代码,即为需要被同步的代码。
2、共享数据:多个线程共同操作的变量。比如ticket就是共享数据
3、同步监视器,俗称:锁。任何一个类的对象,都可以充当锁。
要求:多个线程必须要共用同一把锁。
在实现Runnable接口创建多线程的方式中,我们可以考虑使用this充当同步监视器。
二、同步方法
同步方法即是把操作共享数据的代码放到一个方法内。
1、同步方法仍然涉及到同步监视器,只是不需要我们显示的声明。
2、非静态的同步方法,同步监视器是:this
静态的同步方法,同步监视器是当前类的本身。
三、线程死锁问题
**面试题: synchronized与Lock的异同?
相同:二者都可以解决线程安全问题。
不同:1、synchronized机制在执行完相应的同步代码以后,自动释放同步监视器 2、Lock需要手动的启动同步(Lock()),同时结束同步也需要手动的实现(unlock)
在这里插入图片描述

线程通讯的三个方法,只能出现在同步代码块或同步方法中
wait():一旦执行此方法,当前线程进入阻塞状态,并释放同步监听器。
notify():一旦执行此方法,就会唤醒被wait()的一个线程。如果有多个线程被wait(),就会唤醒优先级高的哪一个。
notifyAll():一旦执行此方法,就会唤醒所有被wait()的线程。
面试题:sleep()方法与wait()方法的异同?
相同点:一旦执行方法,都可以使当前线程进入阻塞状态。
不同点:1、两个方法声明的位置不同:Thread类中声明sleep(),Object类中声明wait().2、调用的要求不同:sleep()可以在任何场景下调用,而wait()仅可以在同步代码块或同步方法中声明。3、关于是否释放同步监视器。当sleep()与wait()同时出现在同步代码块或同步方法中时,sleep()不会释放同步监视器,而wait()会释放。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值