线程
2023.10.19
1.在java中线程是有分优先等级的,可以用setPriority()设置
2.Thread实现了Runnable接口是一个类不是接口
3.实现多线程的三种方式,一种是继承Thread类使用此方式就不能继承其他的类了。还有两种是实现Runnable接口或者实现Callable接口
2023.11.10
1.在Java中,常用的线程通信方式有两种,分别是利用Monitor实现线程通信、利用Condition实现线程通信。
线程同步是线程通信的前提,所以究竟采用哪种方式实现通信,取决于线程同步的方式。
如果是采用synchronized关键字进行同步,则需要依赖Monitor(同步监视器)实现线程通信,Monitor就是锁对象。
在synchronized同步模式下,锁对象可以是任意的类型,所以通信方法自然就被定义在Object类中了,这些方法包括:wait()、notify()、notifyAll()。
一个线程通过Monitor调用wait()时,它就会释放锁并在此等待。当其他线程通过Monitor调用notify()时,则会唤醒在此等待的一个线程。当其他线程通过Monitor调用notifyAll()时,则会唤醒在此等待的所有线程。
JDK 1.5新增了Lock接口及其实现类,提供了更为灵活的同步方式。如果是采用Lock对象进行同步,则需要依赖Condition实现线程通信,Condition对象是由Lock对象创建出来的,它依赖于Lock对象。
Condition对象中定义的通信方法,与Object类中的通信方法类似,它包括await()、signal()、signalAll()。通过名字就能看出它们的含义了,当通过Condition调用await()时当前线程释放锁并等待,当通过Condition调用signal()时唤醒一个等待的线程,当通过Condition调用signalAll()时则唤醒所有等待的线程。
2024.6.24
1.线程的释放是在run()方法执行完之后,但是引用可能还存在。
2024.6.25
1.假如有线程1和线程2同时执行下面的代码,结果可能是
boolean idOdd = false; for (int i = 1; i <= 2; ++i) { if (i % 2 == 1) isOdd = true; else isOdd = false;
// a为线程共享变量 a += i * (isOdd ? 1 : -1) ; }
两个线程串行执行:+1 -2 +1 -2 -> -2
同时+1再分别-2: +1 -2 -2 -> -3
分别+1再同时-2:+1 +1 -2 -> 0
同时+1 同时-2:+1 -2 -> -1
2024.7.14
1.Java使用的是抢占式调度,也就是每个线程将由操作系统来分配执行时间,线程的切换不由线程本身来决定(协同式调度)