Java并发——多线程

创建线程的方法

一、继承Thread
自定义线程类继承Thread,并重写run方法
创建自定义线程类的对象
调用对象的start方法

二、实现Runnable
自定义类实现Runnable接口,并重写run方法
创建自定义类对象
创建Thread类对象,并传入自定义类对象
调用线程类对象的start方法


自定义类实现Callable接口,并重写call方法
创建实现类对象
创建线程池,并传入实现类对象
获取执行结果
ExecutorService es = Executors.newFixedThreadPool(1);
Callable<T> c = new CallableImpl();
Future<T> result = es.submit(c);
T t = result.get();

通过实现接口创建线程的方式,其实是通过静态代理的方式实现的。


Thread.sleep睡眠方法,不释放对象锁,线程进入状态:timed-waiting
yield(让出)方法,让出cpu资源,允许cpu重新调度各个线程,但是cpu调度的未必是其他线程。线程进入状态:runnable?
object.join加入执行方法,当前线程阻塞,cpu开始执行object线程,直到执行结束,即强制执行某个线程,类似于插队。当前线程进入状态:waiting?


函数式接口:只有一个方法的接口被称为函数式接口,对它的实现类的方法调用,简化路径是:内部类->匿名内部类->lamda表达式


线程对象的优先级属性priority取值范围[0,10],优先级只是增加了被优先调度的概率,而非一定被优先调度。需要先设置优先级,再启动线程。


死锁产生的四个必要条件
1.互斥条件:一个资源每次只能被一个进程使用
2.请求与保持条件:一个进程因请求资源而阻塞,对已获得的资源保持不放
3.不剥夺条件:进程已获得的资源,在未使用完之前,不能强行剥夺
4.循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系
上面四个必要条件,只要破解其中一个或多个,就可以破解死锁

ExecutorService是真正的线程池接口,常见子类是ThreadPoolExecutor。
void execute(Runnable runnable): 执行任务/命令,没有返回值,一般用来执行Runnable
<T> Future<T> submit(Callable<T> callable): 执行任务,有返回值,一般用来执行Callable

java程序默认线程:main,gc
java无法直接开启线程,因为是运行在虚拟机中,所以不能操作硬件。而是通过调用本地方法native void start0()间接开启。


wait/sleep方法区别
1.来源不同
wait是Object类成员方法,sleep是Thread类静态方法
企业应用中不应当调用sleep方法,而是juc包中TimeUnit的sleep方法。
2.wait释放锁,sleep不释放锁
3.wait必须在同步代码中使用,sleep可以在任意地方使用


虚假唤醒

使用Lock接口实现类可以创建多个Condition对象,通过不同Condition对象的await/signal方法,可以对不同线程的精准唤醒。


同步辅助类
CountdownLatch,是一个减法计数器,可以等计数器归零后执行后续代码,用于并发转串行
CountDownLatch countDownLatch = new CountDownLatch(5);
countDownLatch.countDown();
countDownLatch.await(); //等待归零

CyclicBarrier,类似于一个加法计数器
CyclicBarrier cyclicBarrier = new CyclicBarrier(8, () -> {System.out.println("8个线程执行后才打印")});
cyclicBarrier.await(); //计数器加1,并等待其他线程也执行到这一行

Semaphore,信号量,多个共享资源互斥的操作,可以用于限流。类似于有一组资源,只要线程获得其中任何一个,就可以执行。执行结束后释放。
Semaphore semaphore = new Semaphore(3); //定义只有3个许可
semaphore.acquire(); //获取许可(资源)。如果许可都被其他线程获取,那么当前线程阻塞等待其他线程释放。
semaphore.release(); //释放许可(资源)

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值