package com.iweb.java;//编写一段代码,4个线程同时运行,2个线程对i加一,2个线程对i减一
public class Homework implements Runnable {
int i =0;
static Object o1 = new Object();
static Object o2 = new Object();
static Object o3 = new Object();
static Object o4 = new Object();
@Override
public void run() {
// TODO Auto-generated method stub
synchronized (o1) {
i++;
System.out.println(i++);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block e.printStackTrace();
synchronized (o1) {
i++;System.out.println(i++);}}}
synchronized (o2) { i--;
System.out.println(i--);
try { Thread.sleep(1000);}
catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
synchronized (o2) {
i--; System.out.println(i--);
}}}}
public class Homework implements Runnable {
int i =0;
static Object o1 = new Object();
static Object o2 = new Object();
static Object o3 = new Object();
static Object o4 = new Object();
@Override
public void run() {
// TODO Auto-generated method stub
synchronized (o1) {
i++;
System.out.println(i++);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block e.printStackTrace();
synchronized (o1) {
i++;System.out.println(i++);}}}
synchronized (o2) { i--;
System.out.println(i--);
try { Thread.sleep(1000);}
catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
synchronized (o2) {
i--; System.out.println(i--);
}}}}
public class Homework implements Runnable {
int i = 0;
static Object o1 = new Object();
static Object o2 = new Object();
static Object o3 = new Object();
static Object o4 = new Object(); @Override
public void run() {
// TODO Auto-generated method stub
synchronized (o1) {
i++;//这里i的值为1
System.out.println(i++);//这里是打印输出i=1后,进行i++值变为2
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
synchronized (o1) {
i++;//这里你是放在catch里面的,没有异常不会执行
System.out.println(i++);//同上
}
}
}
synchronized (o2) {
i--;//这里的值会变成1
System.out.println(i--);//这里是打印输出i=1后,进行i--值变为0
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (o2) {
i--;//这里的值为-1,
System.out.println(i--);//这里是打印输出i=-1后,i--值变为-2
}
}
}
}你如果想实现你所说的结果,得重新写
//可重用同步信号计数器
private static CountDownLatch signal1 = new CountDownLatch(1);
private static CountDownLatch signal2 = new CountDownLatch(1);
private static CountDownLatch signal3 = new CountDownLatch(1);
private static CountDownLatch signal4 = new CountDownLatch(1);第一个线程里, 运行前把 signal1变量放进去,
第二个线程里, 运行前把 signal1, signal2, 变量放进去, 先执行 signal1.await() 这个代码只有在 第一个线程执行了: signal1.countDown(), 才会接着运行.
第三个线程里, 运行前把 signal2, signal3, 变量放进去, 先执行 signal2.await() 这个代码只有在 第一个线程执行了: signal2.countDown(), 才会接着运行.
第四个线程里, 运行前把 signal3, signal4, 变量放进去, 先执行 signal3.await() 这个代码只有在 第一个线程执行了: signal3.countDown(), 才会接着运行. 总程序: signal4.await(), 如果线程 4完成了 执行 signal4.countDown()
每个线程, 执行完成后, 如果 signal5 没有 countDown() 全部等着.
总线程在 知道 线程 4运行完成后, 把 1-4重新new 一个新的:
signal1 = new CountDownLatch(1);
signal2 = new CountDownLatch(1);
signal3 = new CountDownLatch(1);
signal4 = new CountDownLatch(1);
然后进行下一次相减.
无穷无尽.....4个线程, 按顺序一个个执行.
signal4.await() 就是如果计数没有完, 就自己等待.
signal4.countDown() 就是计数减少1, 上面创建就是1, 如果减一次就是0, 也就是告诉 await 不要再等了, 可以往下走了.
把 await() , 与 countDown() 放在不同的线程中操作, 这样就变成了线程等待.