java基础day21

Day21
一、线程(java里的线程都是抢占式分配资源的)

1、并发(高并发):在同一个时间段,执行两个或者多个操作(交替执行)
2、并行:在同一个时间段,同时执行两个或者多个操作(同时进行)
3、进程:一个正在运行程序,在内存里开辟过空间,进程里包含多个线程
4、线程:表示每一条执行的路径,是资源分配的最小单位
5、java里实现多线程的方式
(1)继承Thread(线程类)《jvm允许应用程序并发地运行多个多个线程》

  • 实现多线程步骤:创建Thread的子类 --> 重写run()方法 --> 实例化子类 --> 调用start()开启线程
  • 如果直接调用run()方法是在主线程里执行,没有CPU新开辟一条执行的路径,只有start()方法是开启新线程的
注意:一个线程只能开启一次(即new Thread的对象只能调用一次start()方法),重复开启会产生错误:java.lang.IllegalThreadStateException  

(2)实现Runnable接口(Thread也是实现了这个类)

  • 实现步骤:创建一个类实现Runnable接口 --> 实现run()方法 --> 实例化实现类,然后实例化Thread类,传一个实现类参数 --> 调用start()方法
  • 好处:解决java单继承问题;可扩展性强,实现声明与调用分离,降低耦合度;
  • 多线程的效率:对于整个系统来说,效率提高,但具体到某一个线程,效率是降低

(3)实现Callable接口

  • Callable接口介绍:
    1.java.util.concurrent.Callable是一个泛型接口,只有一个call()方法;
    2.call()方法抛出异常Exception异常,且返回一个指定的泛型类对象;
  • Callable接口实现多线程的应用场景:当父线程想要获取子线程的运行结果时
  • 使用Callable接口实现多线程的步骤
    第一步:创建Callable子类的实例化对象
    第二步:创建FutureTask对象,并将Callable对象传入FutureTask的构造方法中
    第三步:实例化Thread对象,并在构造方法中传入FurureTask对象
    第四步:启动线程
注意:FutureTask实现了Runnable接口和Future接口  
实现Callable和实现Runnable类似,但是功能更强大,具体表现在  
  • 可以在任务结束后提供一个返回值,Runnable不行
  • call方法可以抛出异常,Runnable的run方法不行
  • 可以通过运行Callable得到的Fulture对象监听目标线程调用call方法的结果,得到返回值,(fulture.get(),调用后会阻塞,直到获取到返回值)
二、Thread类

1、线程的常规方法:

  • public static Thread currentThread():返回对当前正在执行的线程对象的引用(也就是当前线程);
  • getName():获取线程的名称,线程名字的默认规则是Thread+i(i 是从0开启);
  • public final void setName(String name):设置线程的名称(一定要在开启线程之前进行设置);
  • public Thread(Runnable target,String name):通过构造的方式来设置线程的名称;
  • public static void sleep(long millis):表示让当前线程睡一会,别的线程可以执行了;
  • public final void setPriority(int newPriority):设置线程的优先级,最小是1,默认是5,最大是10(注意:设置优先级不一定是最先执行,只是优先执行的机遇更大一点);
  • public final void join():线程插队,只能等插队的线程运行结束,其他线程才能运行;
注意:这个方法必须在线程开启之后进行调用;底层调用了wait()方法  
  • public static void yield():线程让步,如果有a,b线程,a线程让步,并不一定b线程就会执行;
  • public final void setDaemon(boolean on):守护线程,如果A,B 线程,B线程是A线程的守护线程,如果A终止了,B线程也会终止;
  • public final boolean isDaemon():判断其是否是守护线程;
三、同步锁

1、同步代码块(synchronized)

  • 语法:synchronized(任意的对象){ 会出现共享数据问题的代码 }

2、同步方法(把synchronized加在方法的定义中,访问修饰符之后)
3、使用Lock接口

  • 实现提供了比使用synchronized方法和语句可获得的更广泛的锁定操作,此实现允许更灵活的结构(一般使用它的实现类ReentrantLock)
  • 常规的方法:public void lock():获取锁;public void unlock():释放锁;
  • 使用步骤:实例化这个对象–>在同步可能出现数据异常的头部调用其lock()–>在同步可以出现数据异常的 尾部加上unlock()(不是特别常用)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值