多线程

关于进程和线程 在分布式课程里有下面的内容(todo)

并发行和并行性是两个概念:

并行指在同一时刻多条指令在多个处理器上同时执行。并行性指同一时刻只有一条指令执行,但多个进程指令被快速轮换执行,使得宏观上具有多个进程同时执行的效果。

线程和进程:

线程是进程的组成部分。线程是独立运行的,抢占式的。可以与其他线程共享父进程的共享变量及部分环境。

线程的创建和启动:

方法一:继承Thread类创建线程类 public class ** extends Thread

new **().start();新建线程

run()和start()方法:run()的方法体就是线程执行体。调用线程对象的start()方法来启动该线程。main()方法体是java程序运行时的默认主线程。

当线程类继承Thread类时,可以直接时用this即可获得当前线程。getName()即返回当前线程的名字

方法二:实现Runnable接口创建线程类public class ** implements Runnable

** * =new**();

new Thread(*,"name").start();来创建线程。

如果想获得当前线程,只能用Thread.currentThread()方法。Thread.currentThread().getName()。

采用这种方法创建的多个线程可以共享线程类的实例属性。

线程的生命周期:

新建(new)、就绪(Runnable)、运行(running)、阻塞(Blocked)、死亡(Dead)

启动线程的正确方式是start方法,而不能直接调用run方法。通过start()启动后线程也并非立即执行,而是就绪。什么时候启动由jvm决定,随机的。

isAlive()方法可以检测某个线程是否死亡。已经死亡的线程无法再次运行。

控制线程:

join线程:main线程调用了jt线程的join()方法,main线程必须等jt执行结束才会向下执行。

后台线程(守护线程):在后台运行,为其他线程提供服务。如果所有的前台线程都死亡,后台线程会自动死亡。

sleep:让当前正在执行的线程暂停一段时间,并进入阻塞状态。

yield:线程让步。将当前正在执行的线程暂停,进入就绪状态。两个线程的优先级相同时,线程调用yield()方法会将执行机会让给优先级相同的其他线程。如果优先级不同,高优先级的线程调用此方法,该线程继续执行。

改变线程优先级:setPriority(1~10)10的优先级最高。

线程同步:

run()方法的方法体不具有同步安全性。java引入了同步监视器来解决这个问题。synchronized(obj){}

在run()方法中放入此函数,此函数中放入同步代码块。逻辑为“加锁->修改->释放锁”,任何时刻只有一个线程可以获得对同步监视器的锁定。也可以同步方法,用synchronized关键字修饰,方法直接在run中调用。

lock锁:常用的ReentrantLock(可重用锁),lock.lock()加锁,在finally{lock.unlock();}释放锁。

死锁:在系统中出现多个同步监视器的情况下,程序很容易出现死锁,即两个线程互相等待对方释放同步监视器。

线程通信:

传统的:wait(),notify(),notifyAll();不能用于Lock保证的同步。

Condition类:await(),signal(),signalAll()

使用阻塞队列控制线程通信。

线程组和线程池:线程组便于管理,线程池减少与操作系统的交互 减少系统开销

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值