java学习回顾---生产者与消费者问题以及多线程补充

生产者和消费者问题

在这里插入图片描述
Lock与unlock用于取代同步。在使用的时候需要创立对象,unlock往往放在finally里面。
Await()与signal()和signalAll用于取代wait()和notify()与notifyAll(),使用的时候同样需要创立对象。Await()往往放在try里面。
区别在于一个lock里面可以有多个conditional(用于操控await等)从而对不同功能线程进行等待和唤醒操作,避免了同步块里不能指定唤醒线程的弊端。
使用示例:
在这里插入图片描述在这里插入图片描述在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
消费者与生产者类似,只是把try内改为res.out();

让线程结束或从wait(),sleep()中恢复运行的方法:在这里插入图片描述

使用方法:x.interrupt(x是想要恢复运行的线程),若想要让线程结束,则在catch语句里放入改变标记的语句(wait常放在try里面,interrupt打断wait后程序会进入catch里),从而使标记改变,循环结束,run()运行结束则线程结束。

守护线程

守护线程(用户线程)即后台的线程,依托于前台线程存在。当一个程序中只有守护线程的时候,虚拟机就自动关闭。如果想把一个线程设置为守护线程,必须要在启动线程之前设置。使用方法:x.setDaemon(true),x为希望设置的线程名称。当一个程序线程全是循环的线程且需求循环次数一样,可以把这些线程全都设置为守护线程,然后主线程决定循环次数,当主线程运行完循环次数之后,主线程自己关闭,此时程序里剩下的线程全都是守护线程,然后程序就会关闭。

join()

Join()作用是使主线程等待某线程结束之后才能继续运行。如:x.join()可以使运行此代码的线程冻结直到x线程结束之后主线程才会运行。Join()对其他创建的线程无效。
比如x1.start();
X2.start();x1.join();
运行这三行代码之后,会有三个线程,即主线程,x1,x2。主线程会冻结,此时虚拟机只会运行x1和x2两个线程,直到x1线程结束之后,主线程恢复运行,如果此时在x1结束之前x2就已经结束了的话,那此时运行的线程只有主线程。如果在x1结束时x2还没结束,那此时运行的线程有主线程和x2。
Join():当A线程执行到了B线程的join()方法时,等B线程全部执行完,A才会执行。
Join()可以用来临时加入线程执行。

线程的优先级

线程的执行优先级有1-10,10为最高,默认优先级为5.可以通过setPriority来调。如:
t1.setPriority(10),作用是把t1线程的优先级调到最高。(低优先级的线程同样会运行到,只是运行到的次数变少)

Yield

Yield可以暂停当前正在执行的线程,并执行其他线程。可以用来使两个线程交替运行。用法:Thread.yield();

猜你喜欢

转载自blog.csdn.net/weixin_46428711/article/details/110917820
今日推荐