多线程

操作系统可以同时执行多个任务,每个任务就是进程;进程可以同时执行多个任务,每个任务就是线程。
线程的划分尺度小于进程,使得多线程程序的并发性高。进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。
多线程优点:
线程之间不能共享内存,但线程间共享内存非常容易;
系统创建进程需要为该进程重新分配系统资源,但创建线程则代价小的多,因此使用多线程来实现多任务并发比多进程效率高;
Java语言内置了多线程功能支持,而不是单纯地作为底层操作系统的调度方式,从而简化了Java的多线程编程。
创建线程:
1、继承Thread类
多个线程无法共享线程类的实例变量。
2、实现Runnable接口创建线程类
多线程可以共享线程类的实例变量。这是因为在这种方式下,程序所创建的Runnable对象只是线程的target,而多个线程可以共享同一个target,所以多个线程可以共享同一个线程类的实例变量。
3、实现Callable接口
提供一个call()方法可以作为线程执行体,但call()方法比run()方法更强大:
call()方法可以有返回值
可以声明抛出异常。

线程生命周期:New新建、Runnable就绪、Running运行、Blocked阻塞和Dead死亡。

控制线程:
join线程
Thread提供了一个线程等待另一个线程完成的方法——join()方法。

后台线程
在后台执行,为其他线程提供服务。JVM的垃圾回收线程就是典型的后台线程。
特征:如果所有的前台线程都死亡,后台线程就会自动死亡。
调用Thread对象的setDaemon(true)就可以将指定线程设置为后台线程,必须在start()方法之前调用。
还提供了一个isDaemon()方法,用于判断指定线程是否为后台线程。
前台线程创建的子线程默认是前台线程,后台线程默认是后台线程。

线程睡眠:sleep
如果需要让当前正在执行的线程暂停一段时间,并进入阻塞状态,则可以通过调用Thread类的静态sleep()方法来实现。

线程让步:yield
与sleep()类似,也可以使当前正在执行的线程暂停,但不会阻塞线程,只是将该线程转入就绪状态。

线程同步:
同步代码块:synchronized(obj){
…//同步代码
}
obj就是同步监视器。目的:阻止两个线程对同一个共享资源进行并发访问。因此通常推荐使用可能被并发访问的共享资源充当同步监视器。
加锁——>修改——>释放锁

同步方法:使用synchronized关键字修饰的方法。若修饰的实例方法(非static),同步监视器是this

同步锁
ReentrantLock可重入锁,常用。

死锁:当两个线程相互等待释放同步监视器时就会发生死锁。尤其是系统中出现多个同步监视器的情况下。
发生死锁,不会出现任何异常和提示,只是所有线程处于阻塞状态,无法继续。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值