java线程wait_JAVA多线程 wait用法

上篇文章我们讲了如何让线程一个一个的执行,今天我们来暂停线程和唤醒线程。

我先上代码:

首先创建一个Usert1类继承Thread类,里面run方法里写一个for循环从1加到99,再写一个getsum()方法获取最后的sum值。

public class Usert1 extends Thread

{

int sum = 0;

public void run()

{

synchronized (this)

{

for (int i = 0; i < 100; i++)

{

sum += i;

}

System.out.println(Thread.currentThread().getName() + "," + sum);

}

}

public int getsum()

{

return this.sum;

}

}

再写一个test类 里面创建一个变量a=10 ,让a和sum相加,打印最后结果。

public class Test

{

public static void main(String[] args)

{

Usert1 t = new Usert1();

t.start();

int a = 10;

synchronized (t)

{

System.out.println(Thread.currentThread().getName() + "," + (t.getsum() + a));

}

}

}

现在两个类已经创建好了,来run一下,按照我们预期结果应该是1加到99再加上10,结果应该等于4960. 我们来看下运行结果:

惊了!结果不一样!!!

我们首先来看第一个打印出来的main,10 这是在Test类main方法下打印出来的,但是值只有10 ,可以看到sum的值没有取到。4950则是子线程回到run方法运算的结果。子线程还没有取到值,main方法就执行下去了,我们需要让main线程暂停到子线程取到值,再唤醒主线程执行下去,修改代码如下:

synchronized (t)

{

try

{

t.wait();

System.out.println(Thread.currentThread().getName() + "," + (t.getsum() + a));

} catch (InterruptedException e)

{

// TODO Auto-generated catch blocke.printStackTrace();

}

}

这是修改的Test类中的synchronized同步块,加上了wait方法。

这个wait方法会暂停当前线程的运行!

这个wait方法会暂停当前线程的运行!

这个wait方法会暂停当前线程的运行!

不知道当前线程的可以用下面这行代码查看当前运行的线程名。

System.out.println(Thread.currentThread().getName());

所以我们将wait方法用在这里是暂停了main线程的运行,而不是看到t.wait();就想到了Usert1 t =newUsert1();中的t,误以为暂停的是子线程。

再修改Usert1类中的run方法:

public void run()

{

synchronized (this)

{

for (int i = 0; i < 100; i++)

{

sum += i;

}

System.out.println(Thread.currentThread().getName() + "," + sum);

//默认隐式自动通知持有当前对象的被阻塞的线程解锁//this.notify();}

}

...其实也没有修改,因为默认唤醒了。

修改过后的结果如下:

运行正常~

已标记关键词 清除标记
表情包
插入表情
评论将由博主筛选后显示,对所有人可见 | 还能输入1000个字符
相关推荐
©️2020 CSDN 皮肤主题: 游动-白 设计师:白松林 返回首页