解决方案 »
- 如何动态获取对象的数组属性
- 线程监控的问题
- 请教有没有socket通信层开发的例子,博客也行,要有同步处理,异步提供回调方法等的,不要一个简单的聊天室例子
- 请问如何在固定几个字符串中随机选择一个?
- 请问如何展开指定的TreeViewer节点
- 新手菜鸟请教小问题,在线等。分不高,见谅啊!
- 关于Java连接SQL Server的小问题
- 服务器给客户端传6个数,客户端根据6个数画圆。为什么我的没画出来?小弟初学,谢谢指教!
- 如何使微软的IIS支持服务器端的JSP Servlet?
- JAVA里如何把double型变量转换成int型,谢谢!我试了round不行!
- JDBC 连接问题
- 有没有什么关键词代表了与内部对象相关的外部对象的引用?
你的问题就在这,你先试着改改
private static final Food food = new Food();
@Override
public void run() {
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]
食物的数量:2
Thread[线程4,5,main]
食物的数量:3
Thread[线程3,5,main]
食物的数量:4
Thread[线程2,5,main]
食物的数量:5这样改对了么
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 Food food;
public TestFood(Food food){
this.food = food;
}
public void run() {
this.food.sumNumber();
}
public static void main(String[] args) {
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();
private static final Food food = new Food();
@Override
public void run() {
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]
食物的数量:2
Thread[线程4,5,main]
食物的数量:3
Thread[线程3,5,main]
食物的数量:4
Thread[线程2,5,main]
食物的数量:5这样改对了么你这样是可以,因为你
private static final Food food = new Food();
这个food变量是static变量
其实你可以只生成一个Runnable实例
这个Runnable实例里维护一个food实例
最后4个线程都使用这个Runnable的实例
你好,我理解你的意思,确实更简便也更直观。 但我刚试着改了下程序:public class Food {
private int number = 1; public Food() {
System.out.println("ahahahaha");
}
public synchronized void sumNumber() {
Thread thread = Thread.currentThread();
number++;
System.out.println(thread + "食物的数量:" + number);
}
}public class TestFood implements Runnable{
private static final Food food = new Food();
//private Food food;
/*public TestFood(Food food) {
this.food = food;
}*/
@Override
public void run() {
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();
}
}用final的方式,我new了4个,但最后的构造器里的打印语句,只显示了1次。
结果:
ahahahaha
Thread[线程1,5,main]食物的数量:2
Thread[线程3,5,main]食物的数量:3
Thread[线程2,5,main]食物的数量:4
Thread[线程4,5,main]食物的数量:5我不理解为什么你说的final new的不是同一个实例。 能讲下原因么,十分感谢!
嗯,了解了,我把final和static的意思给曲解了,感谢!
参数加了final的意思是这个值不可以再改变.永远是这样,然而不同线程每个人都有一个 final Food food = new Food();!他们虽然名字一样.但是没有任何关系.......线程与线程之间是互相独立的.........线程与线程互不影响,除STATIC修饰除外.........其它值互不干扰
http://www.iteye.com/topic/806990
private static int number;
方法一:public class Food {
static private int number = 1;
public static synchronized void sumNumber() {
Thread thread = Thread.currentThread();
System.out.println(thread);
number++;
System.out.println("食物的数量:" + number);
}
}
方法二:public class TestFood implements Runnable{
Food food = new Food();
public void run() {
food.sumNumber();
}
public static void main(String[] args) {
Runnable testFood1 = new TestFood();
new Thread(testFood1,"线程1").start();
new Thread(testFood1,"线程2").start();
new Thread(testFood1,"线程3").start();
new Thread(testFood1,"线程4").start();
new Thread(testFood1,"线程5").start();
}
}
像楼主private static final Food food = new Food();这个加上static没啥意义
Thread testFood1= new Thread(new TestFood());
new Thread(testFood1,"线程1").start();和Runnable testFood1 = new TestFood();
new Thread(testFood1,"线程1").start();有啥区别 好像执行起来是一样的
一种是实现了Runnable.再交于Thread去启动.就像Runnable是设计师只负责设计.Thread是工人,去做事.
第一段代码
Thread testFood1= new Thread(new TestFood());
new Thread(testFood1,"线程1").start();
这段代码多NEW了一个Thread类,重复啰嗦了,可以改成
Thread testFood1= new Thread(new TestFood(),"线程1");
testFood1.start();