java多线程之wait_(三)java多线程之wait notify notifyAll

引言

今天我打算讲一下Object.wait,Object.notify,Object.notifyAll这三个方法. 首先我们查看一下api看看,官方api对这几个方法的介绍.

理论

Object.wait(): 导致当前线程一直等待,直到另一外一个线程用同一个对象调用Object.notify或Object.notifyAll方法.换种说法,就是调用Object.wait()和调用Object.wait(0)行为是一致的.

在调用wait时,必须要有调用对象的锁.而这个锁会一直等待直接这个对象调用notify或notifyAll方法才被释放.这是等待的线程才能重新获取对象的锁而继续执行.

这里需要防止中断或假唤醒线程,所以一般在调用wait会使用循环,比如

synchronized (obj) {

while (当条件不满足时)

obj.wait();

... // Perform action appropriate to condition

}

Object.notify/Object.notifyAll 唤醒一个拥有用到当前对象的锁且在等待的线程.如果有多个等待的线程,则随机唤醒一个.而被唤醒的线程会直到当前线程释放对象的锁后才被执行.被唤醒的线程会使用竞争的方式去获取对象的锁.这些被唤醒的线程都是一视同仁,不会被区别对待.所以每个线程获取对象的锁的几率都是平等的,也是随机的.

总之,在同一个时间点只能有一个线程拥有对象的锁.

上面的解释可能比较官方,出现什么对象的锁,唤醒等待之类的时.初学者可能还不能很好的理解.现在我还是用上篇文章的比喻解释一下.

比如现在有一群小明/'小红'都想进入卧室,卧室的门只有一个,钥匙也只有一把,每次也只能进入一个'小明'和一个小红.(多了就...)这时候卧室里面如果只有有一个人,那么他/她就只能等待,然后释放卧室门的锁.然后唤醒另外一个她/他进来.进来后把卧室门给锁了,等小明和小红谈完人生和理想的时候.再通知其他人,告诉他们房间是空的,可以进来了.这是另外的一群小明/小红就会争先恐后的进来.但还是只能进一个小明和一个小红.(这里不理解,没有关系,看完文章之后,再回过头看一下这里,说不定就会豁然开朗了.)

这些人比喻就是上面讲到的线程,卧室就相当于上面说的对象,门就相当于上面的锁,这样一比喻是不是好理解一点.需要注意的是卧室是特定的一个,即每个人等待的卧室都必须是同一个.这样才能用那把钥匙去开门.

编码

如果有些人还不能理解,那么这里我就写一个程序再来解析一下.就用上面的比喻做例子吧.ok,开始编码.

首先,我们要先定一个抽象卧室类Room,这个类需要用成员变量gril,还必须提供两个方法makeGridInRoom(String gril)和playWithGril(String boy),这个类的实现我们暂时先放放,后面再说

之后,我们要创建中间人来一个找小妞的类,GrilProduct,把卧室room传进来,然后依此找到十个小妞进入卧室里.

public class GrilProduct implements Runnable{

private Room room;

public GrilProduct(Room room) {

this.room = room;

}

@Override

public void run() {

for (int i = 0; i < 10; i ++){

room.makeGridInRoom("小红" + i + "号");

}

}

}

然后,我们还需要有一个花花公子类,来和小妞谈谈人生,说说理想,PlayBoy

public class PlayBoy implements Runnable{

private Room room;

private String boy;

public PlayBoy(Room room, String boy) {

this.room = room;

this.boy = boy;

}

@Override

public void run() {

room.playWithGril(boy);

}

}

最后,我们要让那个中间人活动起来,而且需要来依此十个花花公子来和小妞谈人生,谈理想.毕竟小妞一个人也只能应付一个花花公子,加班是很累的.TestMain

public class TestMain {

public static void main(String[] args) {

Room room1 = new Room1();

playGameInRoom(room1);

// Room room2 = new Room2();

// playGameInRoom(room2);

//

// Room room3 = new Room3();

// playGameInRoom(room3);

//

// Room room4 = new Room4();

// playGameInRoom(room4);

}

public static void playGameInRoom(Room room){

Thread grilProduct = new Thread(new GrilProduct(room));

Set boyThread = new HashSet<>();

for (int i = 0; i < 10; i ++){

boyThread.add(new Thread(new PlayBoy(room, "小明" + i + "号")));

}

grilProduct.start();

for (Thread boy : boyThread){

boy.start();

}

}

}

行了,现在开始来考虑Room要怎么写.

第一个想法,比较简单,小妞来了就来了,花花公子来了就开始谈人生,谈理想.编写Room1继承Room

public class Room1 extends Room{

private String gril;

@Override

public synchronized void makeGridInRoom(String gril){

this.gril = gril;

}

@Override

public synchronized void playWithGril(String boy){

System.out.println(boy + " play with " + this.gril);

this.gril = null;

}

}

运行一下结果:

小明1号 play with 小红9号

小明3号 play with null

小明6号 play with null

小明0号 play with null

小明8号 play with null

小明5号 play with null

小明7号 play with null

小明2号 play with null

小明4号 play with null

小明9号 play with null

我靠,怎么只有小明1号和小红9号聊上了,其他公子自己玩. 哦,原来是小红9号把前面几个给挤掉了,其他小明,小红不服了,凭什么小红9号那么霸气.行,为了满足大家,继续改..

第二个想法,如果花花公子来了,但小妞不在卧室,那么公子就会离开;另外如果一个小妞发现卧室有人,她也选择离开.

public class Room2 extends Room{

@Override

public synchronized void makeGridInRoom(String gril){

if (this.gril != null){

return;

}

this.gril = gril;

}

@Override

public synchronized void playWithGril(String boy){

if (this.gril == null){

return;

}

System.out.println(boy + " play with " + this.gril);

this.gril = null;

}

}

运行结果是

小明1号 play with 小红0号

而且每次运行结果都不一样,这时候其他人不爽了,为什么我进入的时候没人呢?

这里我们需要改变一下策略.如果卧室没人.那么让他们就睡一下,等待其他人来谈完人生再走.

public class Room3 extends Room{

@Override

public synchronized void makeGridInRoom(String gril){

while (this.gril != null){

try {

Thread.sleep(10);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

this.gril = gril;

}

@Override

public synchronized void playWithGril(String boy){

while (this.gril == null){

try {

Thread.sleep(10);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

System.out.println(boy + " play with " + this.gril);

this.gril = null;

}

}

运行结果.我靠,卧室被锁了,而且只有一个人一直在里面孤零零的等着,永远等不到另外一个人来.悲剧了.....

不行,我们还是要改变一下策略.如果花花公子发现卧室里没有小妞,那就先等着.等待小妞来了,让她来叫醒我.小妞也是一样,如果卧室里已经有小妞了,那么就先等着,等他们谈完人生,谈完理想再来叫醒我.

public class Room4 extends Room{

@Override

public synchronized void makeGridInRoom(String gril){

while (this.gril != null){

try {

this.wait();

} catch (InterruptedException e) {

e.printStackTrace();

}

}

try {

Thread.sleep(10);

} catch (InterruptedException e) {

e.printStackTrace();

}

this.notifyAll();

this.gril = gril;

}

@Override

public synchronized void playWithGril(String boy){

while (this.gril == null){

try {

this.wait();

} catch (InterruptedException e) {

e.printStackTrace();

}

}

System.out.println(boy + " play with " + this.gril);

try {

Thread.sleep(10);

} catch (InterruptedException e) {

e.printStackTrace();

}

this.notifyAll();

this.gril = null;

}

}

运行结果:

小明9号 play with 小红0号

小明1号 play with 小红1号

小明4号 play with 小红2号

小明3号 play with 小红3号

小明2号 play with 小红4号

小明6号 play with 小红5号

小明7号 play with 小红6号

小明0号 play with 小红7号

小明5号 play with 小红8号

小明8号 play with 小红9号

谢天谢地啊,每个小明都找到小红了,我再也不用担心被小明/小红在k死了.

后记

在最后两种做法,一种是调用Thread.sleep,一种是调用Object.wait.两种都是是线程睡眠等待,但为什么结果不一样呢?这里解释一下,Thread.sleep会释放资源,但是不会释放锁,所以如果有人进入卧室,就一直霸占这这个卧室,其他压根都进不来.但Object.wait除了会释放资源之外,还会释放锁.等到小红/小明进入卧室,在通知小明/小红进入卧室.

还有使用Object.notifyAll和Object.notify,我自己觉得在可以使用Object.notify的地方,都可以使用Object.notifyAll代替,但是可以使用Object.notifyAll却不能使用Object.notify代替. 在上述的例子,如果只有一个中间人GrilProduct只找一个小红,而且也只有一个花花公子PlayBoy,那么使用Object.notify和Object.notifyAll都一样,但是如果有多个花花公子,就必须使用Object.notifyAll去唤醒所有人,让其中一个人跑进卧室里.其他人进不去,就继续等待.然后继续全部唤醒,继续等待....

Object.wait()和Object.wait(long)的区别,wait()是进入卧室之后就一直等,直到被唤醒,wait(long)则是进入卧室之后一直等或者到了指定时间内被唤醒

对上面的例子改写一下,在GrilProduct改为每500ms才找到一个小红

public class GrilProduct implements Runnable{

private Room room;

public GrilProduct(Room room) {

this.room = room;

}

@Override

public void run() {

for (int i = 0; i < 10; i ++){

try {

Thread.sleep(500);

} catch (InterruptedException e) {

e.printStackTrace();

}

room.makeGridInRoom("小红" + i + "号");

}

}

}

然后对Room4.playWithGril改为

@Override

public synchronized void playWithGril(String boy){

while (this.gril == null){

try {

System.out.println(boy + " 我的心在等待,永远在等待...");

this.wait();

} catch (InterruptedException e) {

e.printStackTrace();

}

}

System.out.println(boy + " play with " + this.gril);

try {

Thread.sleep(10);

} catch (InterruptedException e) {

e.printStackTrace();

}

this.notifyAll();

this.gril = null;

}

运行一下

小明1号 我的心在等待,永远在等待...

小明6号 我的心在等待,永远在等待...

小明3号 我的心在等待,永远在等待...

小明5号 我的心在等待,永远在等待...

小明0号 我的心在等待,永远在等待...

小明8号 我的心在等待,永远在等待...

小明7号 我的心在等待,永远在等待...

小明2号 我的心在等待,永远在等待...

小明4号 我的心在等待,永远在等待...

小明9号 我的心在等待,永远在等待...

小明9号 play with 小红0号

小明4号 我的心在等待,永远在等待...

小明2号 我的心在等待,永远在等待...

小明7号 我的心在等待,永远在等待...

小明8号 我的心在等待,永远在等待...

小明0号 我的心在等待,永远在等待...

小明5号 我的心在等待,永远在等待...

小明3号 我的心在等待,永远在等待...

小明6号 我的心在等待,永远在等待...

小明1号 我的心在等待,永远在等待...

小明1号 play with 小红1号

小明6号 我的心在等待,永远在等待...

小明3号 我的心在等待,永远在等待...

小明5号 我的心在等待,永远在等待...

小明0号 我的心在等待,永远在等待...

小明8号 我的心在等待,永远在等待...

小明7号 我的心在等待,永远在等待...

小明2号 我的心在等待,永远在等待...

小明4号 我的心在等待,永远在等待...

小明4号 play with 小红2号

小明2号 我的心在等待,永远在等待...

小明7号 我的心在等待,永远在等待...

小明8号 我的心在等待,永远在等待...

小明0号 我的心在等待,永远在等待...

小明5号 我的心在等待,永远在等待...

小明3号 我的心在等待,永远在等待...

小明6号 我的心在等待,永远在等待...

小明6号 play with 小红3号

小明3号 我的心在等待,永远在等待...

小明5号 我的心在等待,永远在等待...

小明0号 我的心在等待,永远在等待...

小明8号 我的心在等待,永远在等待...

小明7号 我的心在等待,永远在等待...

小明2号 我的心在等待,永远在等待...

小明2号 play with 小红4号

小明7号 我的心在等待,永远在等待...

小明8号 我的心在等待,永远在等待...

小明0号 我的心在等待,永远在等待...

小明5号 我的心在等待,永远在等待...

小明3号 我的心在等待,永远在等待...

小明3号 play with 小红5号

小明5号 我的心在等待,永远在等待...

小明0号 我的心在等待,永远在等待...

小明8号 我的心在等待,永远在等待...

小明7号 我的心在等待,永远在等待...

小明7号 play with 小红6号

小明8号 我的心在等待,永远在等待...

小明0号 我的心在等待,永远在等待...

小明5号 我的心在等待,永远在等待...

小明5号 play with 小红7号

小明0号 我的心在等待,永远在等待...

小明8号 我的心在等待,永远在等待...

小明8号 play with 小红8号

小明0号 我的心在等待,永远在等待...

小明0号 play with 小红9号

然后在对Room4.playWithGril改写为

@Override

public synchronized void playWithGril(String boy){

while (this.gril == null){

try {

System.out.println(boy + " 我的心在等待,永远在等待...");

this.wait(100);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

System.out.println(boy + " play with " + this.gril);

try {

Thread.sleep(10);

} catch (InterruptedException e) {

e.printStackTrace();

}

this.notifyAll();

this.gril = null;

}

然后再运行一下

小明3号 我的心在等待,永远在等待...

小明1号 我的心在等待,永远在等待...

小明6号 我的心在等待,永远在等待...

小明0号 我的心在等待,永远在等待...

小明8号 我的心在等待,永远在等待...

小明5号 我的心在等待,永远在等待...

小明7号 我的心在等待,永远在等待...

小明2号 我的心在等待,永远在等待...

小明4号 我的心在等待,永远在等待...

小明9号 我的心在等待,永远在等待...

小明3号 我的心在等待,永远在等待...

小明1号 我的心在等待,永远在等待...

小明6号 我的心在等待,永远在等待...

小明8号 我的心在等待,永远在等待...

小明0号 我的心在等待,永远在等待...

小明5号 我的心在等待,永远在等待...

小明7号 我的心在等待,永远在等待...

小明9号 我的心在等待,永远在等待...

小明2号 我的心在等待,永远在等待...

小明4号 我的心在等待,永远在等待...

小明1号 我的心在等待,永远在等待...

小明3号 我的心在等待,永远在等待...

小明6号 我的心在等待,永远在等待...

小明5号 我的心在等待,永远在等待...

小明8号 我的心在等待,永远在等待...

小明0号 我的心在等待,永远在等待...

小明9号 我的心在等待,永远在等待...

小明2号 我的心在等待,永远在等待...

小明4号 我的心在等待,永远在等待...

小明7号 我的心在等待,永远在等待...

小明1号 我的心在等待,永远在等待...

小明3号 我的心在等待,永远在等待...

小明6号 我的心在等待,永远在等待...

小明0号 我的心在等待,永远在等待...

小明8号 我的心在等待,永远在等待...

小明5号 我的心在等待,永远在等待...

小明2号 我的心在等待,永远在等待...

小明7号 我的心在等待,永远在等待...

小明4号 我的心在等待,永远在等待...

小明9号 我的心在等待,永远在等待...

小明3号 我的心在等待,永远在等待...

小明1号 我的心在等待,永远在等待...

小明6号 我的心在等待,永远在等待...

小明8号 我的心在等待,永远在等待...

小明5号 我的心在等待,永远在等待...

小明0号 我的心在等待,永远在等待...

小明2号 我的心在等待,永远在等待...

小明4号 我的心在等待,永远在等待...

小明9号 我的心在等待,永远在等待...

小明7号 我的心在等待,永远在等待...

小明1号 我的心在等待,永远在等待...

小明1号 play with 小红0号

小明7号 我的心在等待,永远在等待...

小明9号 我的心在等待,永远在等待...

小明4号 我的心在等待,永远在等待...

小明2号 我的心在等待,永远在等待...

小明0号 我的心在等待,永远在等待...

小明5号 我的心在等待,永远在等待...

小明8号 我的心在等待,永远在等待...

小明6号 我的心在等待,永远在等待...

小明3号 我的心在等待,永远在等待...

小明6号 我的心在等待,永远在等待...

小明5号 我的心在等待,永远在等待...

小明9号 我的心在等待,永远在等待...

小明7号 我的心在等待,永远在等待...

小明3号 我的心在等待,永远在等待...

小明2号 我的心在等待,永远在等待...

小明0号 我的心在等待,永远在等待...

小明4号 我的心在等待,永远在等待...

小明8号 我的心在等待,永远在等待...

小明6号 我的心在等待,永远在等待...

小明7号 我的心在等待,永远在等待...

小明2号 我的心在等待,永远在等待...

小明0号 我的心在等待,永远在等待...

小明8号 我的心在等待,永远在等待...

小明5号 我的心在等待,永远在等待...

小明9号 我的心在等待,永远在等待...

小明3号 我的心在等待,永远在等待...

小明4号 我的心在等待,永远在等待...

小明6号 我的心在等待,永远在等待...

小明0号 我的心在等待,永远在等待...

小明7号 我的心在等待,永远在等待...

小明4号 我的心在等待,永远在等待...

小明8号 我的心在等待,永远在等待...

小明2号 我的心在等待,永远在等待...

小明3号 我的心在等待,永远在等待...

小明5号 我的心在等待,永远在等待...

小明9号 我的心在等待,永远在等待...

小明8号 我的心在等待,永远在等待...

小明7号 我的心在等待,永远在等待...

小明5号 我的心在等待,永远在等待...

小明3号 我的心在等待,永远在等待...

小明9号 我的心在等待,永远在等待...

小明4号 我的心在等待,永远在等待...

小明0号 我的心在等待,永远在等待...

小明2号 我的心在等待,永远在等待...

小明6号 我的心在等待,永远在等待...

小明3号 play with 小红1号

小明6号 我的心在等待,永远在等待...

小明2号 我的心在等待,永远在等待...

小明0号 我的心在等待,永远在等待...

小明4号 我的心在等待,永远在等待...

小明9号 我的心在等待,永远在等待...

小明5号 我的心在等待,永远在等待...

小明7号 我的心在等待,永远在等待...

小明8号 我的心在等待,永远在等待...

小明5号 我的心在等待,永远在等待...

小明8号 我的心在等待,永远在等待...

小明6号 我的心在等待,永远在等待...

小明9号 我的心在等待,永远在等待...

小明4号 我的心在等待,永远在等待...

小明0号 我的心在等待,永远在等待...

小明2号 我的心在等待,永远在等待...

小明7号 我的心在等待,永远在等待...

小明8号 我的心在等待,永远在等待...

小明9号 我的心在等待,永远在等待...

小明0号 我的心在等待,永远在等待...

小明2号 我的心在等待,永远在等待...

小明5号 我的心在等待,永远在等待...

小明7号 我的心在等待,永远在等待...

小明4号 我的心在等待,永远在等待...

小明6号 我的心在等待,永远在等待...

小明7号 我的心在等待,永远在等待...

小明6号 我的心在等待,永远在等待...

小明2号 我的心在等待,永远在等待...

小明4号 我的心在等待,永远在等待...

小明5号 我的心在等待,永远在等待...

小明8号 我的心在等待,永远在等待...

小明0号 我的心在等待,永远在等待...

小明9号 我的心在等待,永远在等待...

小明7号 我的心在等待,永远在等待...

小明6号 我的心在等待,永远在等待...

小明8号 我的心在等待,永远在等待...

小明0号 我的心在等待,永远在等待...

小明9号 我的心在等待,永远在等待...

小明4号 我的心在等待,永远在等待...

小明2号 我的心在等待,永远在等待...

小明5号 我的心在等待,永远在等待...

小明4号 play with 小红2号

小明8号 我的心在等待,永远在等待...

小明0号 我的心在等待,永远在等待...

小明5号 我的心在等待,永远在等待...

小明2号 我的心在等待,永远在等待...

小明9号 我的心在等待,永远在等待...

小明7号 我的心在等待,永远在等待...

小明6号 我的心在等待,永远在等待...

小明7号 我的心在等待,永远在等待...

小明6号 我的心在等待,永远在等待...

小明0号 我的心在等待,永远在等待...

小明9号 我的心在等待,永远在等待...

小明2号 我的心在等待,永远在等待...

小明5号 我的心在等待,永远在等待...

小明8号 我的心在等待,永远在等待...

小明8号 我的心在等待,永远在等待...

小明0号 我的心在等待,永远在等待...

小明2号 我的心在等待,永远在等待...

小明5号 我的心在等待,永远在等待...

小明6号 我的心在等待,永远在等待...

小明9号 我的心在等待,永远在等待...

小明7号 我的心在等待,永远在等待...

小明2号 我的心在等待,永远在等待...

小明7号 我的心在等待,永远在等待...

小明6号 我的心在等待,永远在等待...

小明9号 我的心在等待,永远在等待...

小明0号 我的心在等待,永远在等待...

小明8号 我的心在等待,永远在等待...

小明5号 我的心在等待,永远在等待...

小明6号 我的心在等待,永远在等待...

小明7号 我的心在等待,永远在等待...

小明2号 我的心在等待,永远在等待...

小明9号 我的心在等待,永远在等待...

小明8号 我的心在等待,永远在等待...

小明0号 我的心在等待,永远在等待...

小明5号 我的心在等待,永远在等待...

小明8号 play with 小红3号

小明5号 我的心在等待,永远在等待...

小明9号 我的心在等待,永远在等待...

小明6号 我的心在等待,永远在等待...

小明0号 我的心在等待,永远在等待...

小明2号 我的心在等待,永远在等待...

小明7号 我的心在等待,永远在等待...

小明6号 我的心在等待,永远在等待...

小明7号 我的心在等待,永远在等待...

小明2号 我的心在等待,永远在等待...

小明0号 我的心在等待,永远在等待...

小明9号 我的心在等待,永远在等待...

小明5号 我的心在等待,永远在等待...

小明9号 我的心在等待,永远在等待...

小明7号 我的心在等待,永远在等待...

小明6号 我的心在等待,永远在等待...

小明5号 我的心在等待,永远在等待...

小明2号 我的心在等待,永远在等待...

小明0号 我的心在等待,永远在等待...

小明2号 我的心在等待,永远在等待...

小明7号 我的心在等待,永远在等待...

小明6号 我的心在等待,永远在等待...

小明0号 我的心在等待,永远在等待...

小明9号 我的心在等待,永远在等待...

小明5号 我的心在等待,永远在等待...

小明0号 我的心在等待,永远在等待...

小明6号 我的心在等待,永远在等待...

小明7号 我的心在等待,永远在等待...

小明9号 我的心在等待,永远在等待...

小明5号 我的心在等待,永远在等待...

小明2号 我的心在等待,永远在等待...

小明6号 play with 小红4号

小明2号 我的心在等待,永远在等待...

小明0号 我的心在等待,永远在等待...

小明5号 我的心在等待,永远在等待...

小明9号 我的心在等待,永远在等待...

小明7号 我的心在等待,永远在等待...

小明9号 我的心在等待,永远在等待...

小明7号 我的心在等待,永远在等待...

小明2号 我的心在等待,永远在等待...

小明5号 我的心在等待,永远在等待...

小明0号 我的心在等待,永远在等待...

小明2号 我的心在等待,永远在等待...

小明0号 我的心在等待,永远在等待...

小明9号 我的心在等待,永远在等待...

小明7号 我的心在等待,永远在等待...

小明5号 我的心在等待,永远在等待...

小明9号 我的心在等待,永远在等待...

小明7号 我的心在等待,永远在等待...

小明5号 我的心在等待,永远在等待...

小明0号 我的心在等待,永远在等待...

小明2号 我的心在等待,永远在等待...

小明0号 我的心在等待,永远在等待...

小明7号 我的心在等待,永远在等待...

小明9号 我的心在等待,永远在等待...

小明5号 我的心在等待,永远在等待...

小明2号 我的心在等待,永远在等待...

小明7号 play with 小红5号

小明0号 我的心在等待,永远在等待...

小明2号 我的心在等待,永远在等待...

小明9号 我的心在等待,永远在等待...

小明5号 我的心在等待,永远在等待...

小明0号 我的心在等待,永远在等待...

小明2号 我的心在等待,永远在等待...

小明5号 我的心在等待,永远在等待...

小明9号 我的心在等待,永远在等待...

小明9号 我的心在等待,永远在等待...

小明5号 我的心在等待,永远在等待...

小明2号 我的心在等待,永远在等待...

小明0号 我的心在等待,永远在等待...

小明2号 我的心在等待,永远在等待...

小明5号 我的心在等待,永远在等待...

小明9号 我的心在等待,永远在等待...

小明0号 我的心在等待,永远在等待...

小明2号 我的心在等待,永远在等待...

小明9号 我的心在等待,永远在等待...

小明5号 我的心在等待,永远在等待...

小明0号 我的心在等待,永远在等待...

小明0号 play with 小红6号

小明5号 我的心在等待,永远在等待...

小明9号 我的心在等待,永远在等待...

小明2号 我的心在等待,永远在等待...

小明2号 我的心在等待,永远在等待...

小明9号 我的心在等待,永远在等待...

小明5号 我的心在等待,永远在等待...

小明2号 我的心在等待,永远在等待...

小明5号 我的心在等待,永远在等待...

小明9号 我的心在等待,永远在等待...

小明2号 我的心在等待,永远在等待...

小明5号 我的心在等待,永远在等待...

小明9号 我的心在等待,永远在等待...

小明9号 我的心在等待,永远在等待...

小明2号 我的心在等待,永远在等待...

小明5号 我的心在等待,永远在等待...

小明5号 play with 小红7号

小明2号 我的心在等待,永远在等待...

小明9号 我的心在等待,永远在等待...

小明2号 我的心在等待,永远在等待...

小明9号 我的心在等待,永远在等待...

小明2号 我的心在等待,永远在等待...

小明9号 我的心在等待,永远在等待...

小明2号 我的心在等待,永远在等待...

小明9号 我的心在等待,永远在等待...

小明2号 我的心在等待,永远在等待...

小明9号 我的心在等待,永远在等待...

小明9号 play with 小红8号

小明2号 我的心在等待,永远在等待...

小明2号 我的心在等待,永远在等待...

小明2号 我的心在等待,永远在等待...

小明2号 我的心在等待,永远在等待...

小明2号 我的心在等待,永远在等待...

小明2号 play with 小红9号

最后,聪明的读者就自己对比一下,两份输出有什么不一样的地方,就可以搞定wait()和wait(long)的区别,这时也应该能明白为什么wait方法的调用要写在while循环里面了.

打赏

如果觉得我的文章写的还过得去的话,有钱就捧个钱场,没钱给我捧个人场(帮我点赞或推荐一下)

900726442bd86390216ee953e8d06880.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/264522.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

得不到和已失去

凉凉滑滑&#xff0c;这样的天气&#xff0c;我该喜欢的&#xff0c;就像在酷暑时所盼望的一样。可是又一次在凌晨凉飕飕的空气中醒来时&#xff0c;为什么我却倍感凄凉的蜷成一团怀念盛夏的热烈了呢。更加恶劣的是&#xff0c;为什么在正午炙热的阳光下&#xff0c;我却又在怀…

lightoj 1020 (博弈)

思路&#xff1a;很简单的博弈&#xff0c;找出每个人先拿的必胜态进行状态转移即可。#include<cstdio> #include<string> #include<cstring> #include<iostream> #include<algorithm> using namespace std; int main(){int t, n, CASE(0);char …

2019 GDUT Rating Contest II : A. Taming the Herd

题面&#xff1a; A. Taming the Herd Input file: standard inputOutput file: standard outputTime limit: 1 secondMemory limit: 256 megabytesEarly in the morning, Farmer John woke up to the sound of splintering wood. It was the cows, and they were breaking out…

仅对此用户禁用 java_Spring Security实现禁止用户重复登陆的配置原理

这篇文章主要介绍了Spring Security实现禁止用户重复登陆的配置原理,文中通过示例代码介绍的非常详细&#xff0c;对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下系统使用了Spring Security做权限管理&#xff0c;现在对于系统的用户&#xff0c;需要改动配…

SQL server 系统优化--通过执行计划优化索引(1) (转)

SQL server 系统优化--通过执行计划优化索引&#xff08;1&#xff09; 前几天,远离上海&#xff0c;到了温州&#xff0c;在客户的这边处理系统慢&#xff0c;该系统每天正常down机7次左右&#xff0c;在线人员一多&#xff0c;系统运行缓慢&#xff0c;严重影响业务操作,到了…

Linux运维系统工程师系列---13

定制安装定制安装&#xff0c;也叫源码安装&#xff0c;需要自己编译源代码的安装方式步骤&#xff1a;1、解压源代码包2、配置 configure3、编译 make4、安装 make install接下来开始做实验&#xff0c;希望朋友们自己动手实践&#xff0c;有啥不清楚的可以直接提问我&#xf…

java system.setproperties_在JAVA中 System.getProperty 和 System.setProperty 方法.

今天着手研究TOMCAT源码.在刚開始的时候Startup类中init方法中调用非常多次System.getProperty和System.setProperty的方法.后来经过网上搜索才得知,这是对操作系统变量操作的方法.System还提供一个静态方法 System.getProperties(). 这种方法能够罗列出你系统的所有变量.调用S…

雷林鹏分享:XML 编码

XML 编码 XML 文档可以包含非 ASCII 字符&#xff0c;比如挪威语 &#xff0c;或者法语 。 为了避免错误&#xff0c;需要规定 XML 编码&#xff0c;或者将 XML 文件存为 Unicode。 XML 编码错误 如果您载入一个 XML 文档&#xff0c;您可以得到两个不同的错误&#xff0c;…

C#中理解接口以及接口的作用

在C#的开发中&#xff0c;接口是非常重要也非常好用的。可是很多时候很多人都不是很了解接口的做用&#xff0c;以及该如何使用。下面我们就来理解接口的作用&#xff0c;并看看如何使用吧。假设我们公司有两种程序员&#xff1a;VB程序员&#xff0c;指的是用VB写程序的程序员…

java开发中遇到的问题及解决方法(持续更新)

工作中&#xff0c;以C/C开发为主&#xff0c;难免与其他服务和Web进行交换&#xff0c;Java开发必不可少&#xff0c;又不想动用Eclipse大家伙&#xff0c;只能自己动手编写脚本进行Java代码的编译和运行&#xff0c;期间遇到的一些问题&#xff0c;记录下来供自己和大家参考。…

c语言转化java工具_详解C语言常用的一些转换工具函数

1、字符串转十六进制代码实现&#xff1a;void StrToHex(char *pbDest, char *pbSrc, int nLen){char h1,h2;char s1,s2;int i;for (i0; i{h1 pbSrc[2*i];h2 pbSrc[2*i1];s1 toupper(h1) - 0x30; //toupper 转换为大写字母if (s1 > 9)s1 - 7;s2 toupper(h2) - 0x30;if (…

vue项目使用eslint

转载自 https://www.cnblogs.com/hahazexia/p/6393212.html eslint配置方式有两种&#xff1a; 注释配置&#xff1a;使用js注释来直接嵌入ESLint配置信息到一个文件里配置文件&#xff1a;使用一个js&#xff0c;JSON或者YAML文件来给整个目录和它的子目录指定配置信息。这些配…

提里奥·弗丁(魔兽世界里的NPC)

弗丁的名字大家也许并不熟悉&#xff1b;但白银之手骑士团的大名&#xff0c;恐怕天下无人不识。作为白银之手骑士团创始人光明使者乌瑟尔的亲密友人&#xff0c;当年的弗丁是骑士团中地位最为崇高的圣骑士之一。在第二次战争中身先士卒的表现无愧白银之手的神圣之名。荣归故里…

java http请求插件_java http请求工具整理

处理了http 的get和post的请求&#xff0c;分别支持同步处理&#xff0c;异步处理两种方式下见代码。Slf4jpublic class HttpUtils { /** * 同步请求http请求 不推荐 * * param url * return */ public static byte[] httpGetSync(String url) { HttpGet httpGet new HttpGet(…

mysql存储过程语法及实例

2019独角兽企业重金招聘Python工程师标准>>> 存储过程如同一门程序设计语言&#xff0c;同样包含了数据类型、流程控制、输入和输出和它自己的函数库。 --------------------基本语法-------------------- 一.创建存储过程 create procedure sp_name() begin ......…

JAVA 重写重载/多态/抽象类/封装/接口/包

重写&重载 重写(override)是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变。即外壳不变&#xff0c;核心重写&#xff01; 重载(overloading) 是在一个类里面&#xff0c;方法名字相同&#xff0c;而参数不同。返回类型可以相同也可以不同。 …

手写一个简单的WinForm程序(2)

经过高人指教之后的代码&#xff1a; using System; using System.Windows.Forms; using System.Drawing; namespace MyApplication { public partial class Form1 : Form { private delegate void ShowText(); TextBox textBox1 new TextBox(); …

mysql部署jar_mysql+jar踩坑记录

一、关于mysqlmysql 5用的驱动是com.mysql.jdbc.Drivermysql 6用的驱动是com.mysql.cj.jdbc.Drivermysql连接url中useUnicodetrue&characterEncodingutf8&serverTimezoneAsia/Shanghai作用useUnicodetrue&characterEncodingutf8—用来指定编码格式为utf8serverTime…

ajax和Java session监听

Session监听嘛&#xff0c;没什么好解释的&#xff0c;java提供了很灵活的事件机制来监听session&#xff0c;可以监听session的创建和销毁&#xff0c;监控session 所携带数据的创建、变化和销毁&#xff0c;可以监听session的锐化和钝化&#xff08;了解对象序列化的兄弟应该…

计算机历年考研复试上机基础题(一)

abc 题目描述 设a、b、c均是0到9之间的数字&#xff0c;abc、bcc是两个三位数&#xff0c;且有&#xff1a;abcbcc532。求满足条件的所有a、b、c的值。输入描述: 题目没有任何输入。 输出描述: 请输出所有满足题目条件的a、b、c的值。 a、b、c之间用空格隔开。 每个输出占一行。…