等待唤醒机制和匿名内部类#
等待唤醒机制#
synchronized关键字#
使用synchronized来实现并发
class DST{ //判断条件DST
boolean A = false ; //判断条件
}
class Thread_A extends Thread{
private DST dst ;
public Thread_A(DST dst){
this.dst = dst;
}
@Override
public void run() {
synchronized (dst) {
if (dst.A == false) {
for (int Time = 0; Time < 5; Time++) {
System.out.println("Thread_A: " + Time);
}
}
dst.A = true;
System.out.println("dst.A = true;");
}
}
}
class Thread_B extends Thread{
private DST dst ;
public Thread_B(DST dst){
this.dst = dst;
}
@Override
public void run() {
synchronized (dst) {
if(dst.A == true) {
for (int Time = 0; Time < 5; Time++) {
System.out.println("Thread_B: " + Time);
}
}
}
}
}
public class DemoStudyThread {
public static void main(String[] args) throws InterruptedException {
DST dst = new DST();
Thread_A thread_a = new Thread_A(dst);//同步DST
Thread_B thread_b = new Thread_B(dst);
thread_a.start();
thread_b.start();
}
}输出结果:
Thread_A: 0
Thread_A: 1
Thread_A: 2
Thread_A: 3
Thread_A: 4
dst.A = true;
Thread_B: 0
Thread_B: 1
Thread_B: 2
Thread_B: 3
Thread_B: 4wait()和notify()#
- wait:线程不再活动,进入wait set中,不会浪费cpu,这时的状态就是waiting,必须等着另一个线程执行唤醒notify动作,把在waiting中的线程唤醒,这时waiting 中的线程从waiting set中释放出来。
- notify:从waiting set中选取一个线程释放,
- notifyAll:把waiting set中所有的线程唤醒。
注意事项:从waiting set中释放的线程并不代表可以立即恢复执行,只是进入可执行状态;
class DST{ //判断条件DST
boolean A = false ; //判断条件
}
class Thread_A extends Thread{
private DST dst ;
public Thread_A(DST dst){
this.dst = dst;
}
@Override
public void run() {
synchronized (dst) {
if (dst.A == false) {
System.out.println("Thread_A");
}
dst.A = true;
}
}
}
class Thread_B extends Thread{
private DST dst ;
public Thread_B(DST dst){
this.dst = dst;
}
@Override
public void run() {
synchronized (dst) {
if (dst.A == false) { //在这里如果判断条件是false,线程B则会进入休眠
try {
System.out.println("dst.wait();");
dst.wait();//如果为false,线程B则会休眠,后面的代码(测试代码A)将不会执行
System.out.println("Thread_B(Tst_A)");//测试代码A
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}else {
dst.notify();
System.out.println("dst.notify();");
}
}
}
}
public class DemoStudyThread {
public static void main(String[] args) throws InterruptedException {
DST dst = new DST();
Thread_A thread_a = new Thread_A(dst);//同步DST
Thread_B thread_b = new Thread_B(dst);
thread_a.start();
thread_b.start();
}
}输出结果:
Thread_A
dst.notify();注意事项:
- wait和notify方法必须要用同一个锁对象,锁对象只能唤醒同一个锁对象中等待的线程。
- 锁对象可以是任意对象。
- wait和notify方法必须要放在同步代码块或者同步方法中。
mbda创建匿名内部类
Lambda标准格式#
由3部分组成,参数、箭头、代码。(参数类型 参数名称)->{代码语句}
利用匿名内部类创建线程#
好处:可以省去实现类的定义,即不用再单独定义一个Runnable的实现类了。
public class DemoTest {
public static void main(String[] args) {
new Thread(new Runnable() {
@Override
public void run() {
for (int Time = 0; Time < 3; Time ++) {
System.out.println("New Thread running: " + Time );
}
}
}).start();
}
}输出结果:
New Thread running: 0
New Thread running: 1
New Thread running: 2