书中有道线程的练习题:
编写一个类,在它的对象中存储一个当前值,并提供一个方法对这个值进行累加并打印出新值。编写一个程序,创建一个这样的对象和多个线程,并在每一个线程重复地调用这个累加的方法。要求编写的类不会丢失任何累加的结果。
我自己试着写了下
public class Food {
private int number = 1;
public synchronized void sumNumber() {
Thread thread = Thread.currentThread();
System.out.println(thread);
number++;
System.out.println("食物的数量:" + number);
}
}
public class TestFood implements Runnable{
@Override
public void run() {
final Food food = new Food();
food.sumNumber();
}
public static void main(String[] args) {
Runnable testFood1 = new TestFood();
Runnable testFood2 = new TestFood();
Runnable testFood3 = new TestFood();
Runnable testFood4 = new TestFood();
new Thread(testFood1,"线程1").start();
new Thread(testFood2,"线程2").start();
new Thread(testFood3,"线程3").start();
new Thread(testFood4,"线程4").start();
}
}
运行结果是:
Thread[线程1,5,main]
Thread[线程2,5,main]
食物的数量:2
Thread[线程3,5,main]
食物的数量:2
Thread[线程4,5,main]
食物的数量:2
食物的数量:2
这个好像好像没有满足这道题的要求啊,求大师指点!!
------解决方案--------------------
多个线程要同时操作同一个对象,那这个时候你在线程的run方法中去创建这个对象会导致每个线程每运行一次都会各自去创建一个对象,那么为了共用这个对象,你需要在线程开始前就创建好这个对象,然后在创建线程的时候把这个对象传递给线程。这样就对了,代码如下:
Food food = new Food();
Runnable testFood1 = new TestFood( food);
Runnable testFood2 = new TestFood( food);
Runnable testFood3 = new TestFood( food);
Runnable testFood4 = new TestFood( food);
new Thread(testFood1,"线程1").start();
new Thread(testFood2,"线程2").start();
new Thread(testFood3,"线程3").start();
new Thread(testFood4,"线程4").start();
根据我的思路,你还需要为TestFood类建立一个带参数的构造方法,这样在TestFood内部就含有Food类的引用,那用这个引用去操作Food类的时候才没有问题。。。。
------解决方案--------------------
你这样是可以,因为你
private static final Food food = new Food();
这个food变量是static变量
其实你可以只生成一个Runnable实例
这个Runnable实例里维护一个food实例
最后4个线程都使用这个Runnable的实例
------解决方案--------------------
final要不要无所谓.........已经OK了...