先上一个最烂的:木有经过深思熟虑,随手写的。import java.util.Arrays;// 使用三个线程分别对一个长度为3的int数组的每一项加1后由第四个线程输出3个int的值的和。
class AddThread implements Runnable
{
private Lock lock;
private int index;
private int[] arr;
AddThread(Lock lock, int index, int[] arr)
{
this.lock = lock;
this.index = index;
this.arr = arr;
}
@Override
public void run()
{
synchronized (lock)
{
while (lock.allTrue())
{
try
{
lock.wait();
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
this.arr[index]++;
System.out.println("index " + index + " 加过了!");
this.lock.setTrue(index);
try
{
Thread.sleep((long) (Math.random() * 300));
}
catch (InterruptedException e)
{
e.printStackTrace();
}
lock.notify();
}
}
}class PrintThread implements Runnable
{
private Lock lock;
private int[] arr;
PrintThread(Lock lock, int[] arr)
{
this.lock = lock;
this.arr = arr;
}
@Override
public void run()
{
synchronized (lock)
{
while (!lock.allTrue())
{
try
{
lock.wait();
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
try
{
Thread.sleep((long) (Math.random() * 300));
}
catch (InterruptedException e)
{
e.printStackTrace();
}
int res = 0;
for (int a : arr)
res += a;
System.out.println(Arrays.toString(arr) + "==" + res);
lock.setFalseAll();
lock.notify();
}
}
}class Lock
{
private boolean[] barr;
Lock(int[] arr)
{
this.barr = new boolean[arr.length];
}
void setTrueAll()
{
Arrays.fill(this.barr, true);
}
void setFalseAll()
{
Arrays.fill(this.barr, false);
}
void setTrue(int i)
{
this.barr[i] = true;
}
void setFalse(int i)
{
this.barr[i] = false;
}
boolean allFalse()
{
for (boolean b : barr)
{
if (b)
return false;
}
return true;
}
boolean allTrue()
{
for (boolean b : barr)
{
if (!b)
return false;
}
return true;
}
}public class MianShi
{
public static void main(String[] args)
{
int[] arr =
{
1, 2, 3
};
Lock lock = new Lock(arr);
new Thread(new PrintThread(lock, arr)).start();
new Thread(new AddThread(lock, 0, arr)).start();
new Thread(new AddThread(lock, 1, arr)).start();
new Thread(new AddThread(lock, 2, arr)).start();
}
}
class AddThread implements Runnable
{
private Lock lock;
private int index;
private int[] arr;
AddThread(Lock lock, int index, int[] arr)
{
this.lock = lock;
this.index = index;
this.arr = arr;
}
@Override
public void run()
{
synchronized (lock)
{
while (lock.allTrue())
{
try
{
lock.wait();
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
this.arr[index]++;
System.out.println("index " + index + " 加过了!");
this.lock.setTrue(index);
try
{
Thread.sleep((long) (Math.random() * 300));
}
catch (InterruptedException e)
{
e.printStackTrace();
}
lock.notify();
}
}
}class PrintThread implements Runnable
{
private Lock lock;
private int[] arr;
PrintThread(Lock lock, int[] arr)
{
this.lock = lock;
this.arr = arr;
}
@Override
public void run()
{
synchronized (lock)
{
while (!lock.allTrue())
{
try
{
lock.wait();
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
try
{
Thread.sleep((long) (Math.random() * 300));
}
catch (InterruptedException e)
{
e.printStackTrace();
}
int res = 0;
for (int a : arr)
res += a;
System.out.println(Arrays.toString(arr) + "==" + res);
lock.setFalseAll();
lock.notify();
}
}
}class Lock
{
private boolean[] barr;
Lock(int[] arr)
{
this.barr = new boolean[arr.length];
}
void setTrueAll()
{
Arrays.fill(this.barr, true);
}
void setFalseAll()
{
Arrays.fill(this.barr, false);
}
void setTrue(int i)
{
this.barr[i] = true;
}
void setFalse(int i)
{
this.barr[i] = false;
}
boolean allFalse()
{
for (boolean b : barr)
{
if (b)
return false;
}
return true;
}
boolean allTrue()
{
for (boolean b : barr)
{
if (!b)
return false;
}
return true;
}
}public class MianShi
{
public static void main(String[] args)
{
int[] arr =
{
1, 2, 3
};
Lock lock = new Lock(arr);
new Thread(new PrintThread(lock, arr)).start();
new Thread(new AddThread(lock, 0, arr)).start();
new Thread(new AddThread(lock, 1, arr)).start();
new Thread(new AddThread(lock, 2, arr)).start();
}
}
解决方案 »
- dbcp 双连接池配置
- 一个关于JSP中循环的问题
- 小弟不求代码,只为。。。。。。。。
- javamail--inbox.getMessages()只能获取到新邮件
- 高手救命啊! Tomcat6.0.13 的struts配置文件加载问题,100分马上发
- XSLT的template的匹配问题
- java中遇到的问题,详见内贴。请问windows的最大允许路径长度可以修改吗?如果可以,怎么修改呢?谢谢
- 求教:<logic:iterate >标签
- 如何计算两个java.util.Date之间相差的天数啊?
- 初级问题:请问(org.w3c.dom和org.w3c.sax)在jdk 1.4 的那个包中???
- 大家来看看一个空指针异常
- js打印PDF文件
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;public class TestThreadPool {
public static void main(String[] args) {
int[] arr = { 1, 2, 3};
Executor executor = Executors.newFixedThreadPool(4);
executor.execute(new Add1Thread( 0, arr));
executor.execute(new Add1Thread( 1, arr));
executor.execute(new Add1Thread( 2, arr));
executor.execute(new Print1Thread(arr));
}
}class Add1Thread implements Runnable{ public int[] arr;
public int i;
public Add1Thread(int index, int[] a){
this.arr = a;
this.i = index;
}
@Override
public void run() {
// TODO Auto-generated method stub
this.arr[i]++;
}
}class Print1Thread implements Runnable{ public int[] arr;
public Print1Thread(int[] a){
this.arr = a;
}
@Override
public void run() {
int res = 0;
for (int a : arr)
res += a;
System.out.println(Arrays.toString(arr) + "==" + res);
}
}