黑马程序员技术交流社区
标题:
主函数中的常量怎么才能让多线程引用?
[打印本页]
作者:
杨卓儒
时间:
2012-7-25 22:01
标题:
主函数中的常量怎么才能让多线程引用?
本帖最后由 Lewis 于 2012-7-25 23:20 编辑
今天总结多线程,在自己写的一个多线程程序中,我想要线程处理客户类100次,但是这个
循环次数
应该定义在哪儿呢? 按理说应该定义在主函数中,便于修改,但是我把循环次数SUM定义在了主函数中后,在线程类中引用SUM则找不到常量,如果在SUM前面加了PUBLIC的话,直接提示非法的开头~~郁闷了。最后我只能定义在客户类中,和计数变量count一样的定义和引用,倒是没问题。但是觉得这样很麻烦。下面是我的程序代码,大家看看我该怎么改,才能保证能让循环次数SUM作为一个常量,保存在主函数中便于修改~
import java.util.concurrent.locks.*;
class Demo
{
public static void main(String[] args)
{
//创建客户对象
Food f = new Food();
//创建两个厨师线程,开始线程
new Thread(new Chef(f)).start();
new Thread(new Chef(f)).start();
//创建两个吃货线程,开始线程
new Thread(new Eater(f)).start();
new Thread(new Eater(f)).start();
}
}
//创建客户类
class Food
{
private String name;
private int count = 1; //计数器
private int SUM = 100; //循环次数
private boolean flag = false;//定义标志,
private Lock lock = new ReentrantLock(); //创建锁
private Condition con_cook = lock.newCondition(); //创建厨师的条件队列
private Condition con_eat = lock.newCondition(); //创建吃货的条件队列
public int getCount()
{
return count;
}
public int getSum()
{
return SUM;
}
//创建厨师类线程的执行函数内容,将其封装起来
public void cook(String name) throws InterruptedException
{
lock.lock();//为线程上锁,此时在解锁之前,cpu的执行权只所属一个线程
try
{
while(flag)
con_cook.await();//使当前厨师线程进入等待状态
this.name = count++ + name;
System.out.println(Thread.currentThread().getName()+"厨子:......第"+this.name+"做好了,快吃吧");
flag = true;
con_eat.signal();//唤醒一个吃货线程
}
finally
{
lock.unlock();//为线程解锁,释放资源
}
}
public void eat() throws InterruptedException
{
lock.lock();//为线程上锁,此时在解锁之前,cpu的执行权只所属一个线程
try
{
while(!flag)
con_eat.await();//使当前吃货线程进入等待状态
System.out.println(Thread.currentThread().getName()+"吃货:......第"+this.name+"吃完了,快做吧");
flag = false;
con_cook.signal();//唤醒一个厨师线程
}
finally
{
lock.unlock();//为线程解锁,释放资源
}
}
}
//定义厨师类,为实现接口型
class Chef implements Runnable
{
private Food f;
Chef(Food f)
{
this.f = f;
}
public void run()
{
while(f.getSum()>f.getCount())
{
try
{
f.cook("盘");
}
catch (InterruptedException e)
{
}
}
}
}
//定义吃货类,为继承Thread类
class Eater extends Thread
{
private Food f;
Eater(Food f)
{
this.f = f;
}
public void run()
{
while(f.getSum()>f.getCount())
{
try
{
while(true)
f.eat();
}
catch (InterruptedException e)
{
}
}
}
}
复制代码
作者:
杨卓儒
时间:
2012-7-25 22:01
为什么我打的字有阴影。。。郁闷
作者:
杨卓儒
时间:
2012-7-25 22:09
没人帮忙吗?????顶起 ~~
作者:
杨卓儒
时间:
2012-7-25 23:19
突然想明白了,我这个问题好愚蠢~~定义静态常量应该定义在Demo类中,而不知Main函数中。定义在Demo类中后,在下面的线程类中
直接使用 Demo.SUM 便可引用。
作者:
朱烈葵
时间:
2012-7-25 23:34
帖子挺好, 我带厂里 慢慢看,看看能不能解决
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2