线程

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使用的是抢占式调度,也就是每个线程将由操作系统来分配执行时间,线程的切换不由线程本身来决定(协同式调度)

posted @ 2023-10-19 23:29  sellingpear  阅读(10)  评论(0)    收藏  举报