今天总结多线程,在自己写的一个多线程程序中,我想要线程处理客户类100次,但是这个 循环次数 应该定义在哪儿呢? 按理说应该定义在主函数中,便于修改,但是我把循环次数SUM定义在了主函数中后,在线程类中引用SUM则找不到常量,如果在SUM前面加了PUBLIC的话,直接提示非法的开头~~郁闷了。最后我只能定义在客户类中,和计数变量count一样的定义和引用,倒是没问题。但是觉得这样很麻烦。下面是我的程序代码,大家看看我该怎么改,才能保证能让循环次数SUM作为一个常量,保存在主函数中便于修改~
1.import java.util.concurrent.locks.*;
2.
3.class Demo
4.{
5.public static void main(String[] args)
6.{
7.
8.//创建客户对象
9.Food f = new Food();
10.
11.//创建两个厨师线程,开始线程
12.new Thread(new Chef(f)).start();
13.new Thread(new Chef(f)).start();
14.
15.//创建两个吃货线程,开始线程
16.new Thread(new Eater(f)).start();
17.new Thread(new Eater(f)).start();
18.}
19.}
20.
21.//创建客户类
22.
23.class Food
24.{
25. private String name;
26.private int count = 1; //计数器
27.private int SUM = 100; //循环次数
28.private boolean flag = false;//定义标志,
29.
30.private Lock lock = new ReentrantLock(); //创建锁
31.
32.private Condition con_cook = lock.newCondition(); //创建厨师的条件队列
33.private Condition con_eat = lock.newCondition(); //创建吃货的条件队列
34.
35.public int getCount()
36.{
37.return count;
38.}
39.
40.public int getSum()
41.{
42.return SUM;
43.}
44.
45.//创建厨师类线程的执行函数内容,将其封装起来
46.public void cook(String name) throws InterruptedException
47.{
48.lock.lock();//为线程上锁,此时在解锁之前,cpu的执行权只所属一个线程
49.try
50.{
51.while(flag)
52.con_cook.await();//使当前厨师线程进入等待状态
53.
54.this.name = count++ + name;
55.System.out.println(Thread.currentThread().getName()+"厨子:......第"+this.name+"做好了,快吃吧");
56.flag = true;
57.con_eat.signal();//唤醒一个吃货线程
58.}
59.finally
60.{
61.lock.unlock();//为线程解锁,释放资源
62.}
63.}
64.
65.public void eat() throws InterruptedException
66.{
67.lock.lock();//为线程上锁,此时在解锁之前,cpu的执行权只所属一个线程
68.try
69.{
70.while(!flag)
71.con_eat.await();//使当前吃货线程进入等待状态
72.System.out.println(Thread.currentThread().getName()+"吃货:......第"+this.name+"吃完了,快做吧");
73.flag = false;
74.con_cook.signal();//唤醒一个厨师线程
75.}
76.finally
77.{
78.lock.unlock();//为线程解锁,释放资源
79.}
80.}
81.
82.}
83.
84.//定义厨师类,为实现接口型
85.class Chef implements Runnable
86.{
87.private Food f;
88.
89.Chef(Food f)
90.{
91.this.f = f;
92.}
93.public void run()
94.{
95.while(f.getSum()>f.getCount())
96.{
97.try
98.{
99.f.cook("盘");
100.}
101.catch (InterruptedException e)
102.{
103.}
104.}
105.}
106.}
107.
108.//定义吃货类,为继承Thread类
109.class Eater extends Thread
110.{
111.private Food f;
112.
113.Eater(Food f)
114.{
115.this.f = f;
116.}
117.public void run()
118.{
119.while(f.getSum()>f.getCount())
120.{
121.try
122.{
123.while(true)
124.f.eat();
125.}
126.catch (InterruptedException e)
127.{
128.}
129.}
130.}
131.}
大家看看我该怎么改,才能保证能让循环次数SUM作为一个常量,保存在主函数中便于修改~
分享到:
相关推荐
适合初学者使用,Java多线程技术实现矩阵乘积计算
在 C 中,有两种简单的定义常量的方式: 1.使用 #define 预处理器。 2.使用 const 关键字。 c语言变量 变量其实只不过是程序可操作的存储区的名称。C 中每个变量都有特定的类型,类型决定了变量存储的大小和布局,该...
一个用Java写的多线程相乘代码,及其测试。
C语言程序设计-求出二维数组周边元素之和,作为函数值返回;二维数组的值在主函数中赋予;
主要介绍了php类常量用法,实例分析了php中类常量的概念、特性与相关使用技巧,需要的朋友可以参考下,类常量属于类自身,不属于对象实例,不能通过对象实例访问,子类可以重写父类中的常量,可以通过(parent::)来...
C语言中的文字常量区与栈区分析 C语言中的文字常量区与栈区分析 C语言中的文字常量区与栈区分析 C语言中的文字常量区与栈区分析 C语言中的文字常量区与栈区分析 C语言中的文字常量区与栈区分析 C语言中的文字常量区...
本文章是关于C语言中const定义常量 。
在truestudio for stm32 IDE开发中如何定义常量到内部flash中。
采用I/O复用技术select实现socket通信,采用多线程负责每个客户操作处理,完成Linux下的多客户聊天室! OS:Ubuntu 15.04 IDE:vim gcc make DB:Sqlite 3 Time:2015-12-09 ~ 2012-12-21 项目功能架构: 1. ...
Pywin32是一个Python库,为python提供访问Windows API的扩展,提供了齐全的windows常量、接口、线程以及COM机制等等
易语言 常量支持库.fne 常量支持库 常量支持库 常量支持库 常量支持库
c++常量引用.zip
煤中常量金属元素是煤的重要组成,也是影响煤物理化学性质及加工利用的主要因素。通过测试淮北煤田16个煤样的4种常量金属元素(Fe、Ca、K和Ti)含量,分析其含量和赋存特征,并在此基础上,对去除铁元素的煤样和原煤样进行...
VB教程 中都有哪些常量,都有何作用 vbCr Chr(13) 回车符。 vbCrLf Chr(13) & Chr(10) 回车符与换行符。 vbFormFeed Chr(12) 换页符;在 Microsoft Windows 中不适用。
c c++常量引用_
简单使用示例: ${Constants.EXECUTE_STATUS_OK}
常量可以不经说明而直接在程序中引用。 在C语言中,根据常量的取值对象将其分为以下几种类型: 直接常量 符号常量 转义字符 1-2 常量 整型常量:如1、0、-12等; 实型常量:如3.1415926、-0.5等; 字符型常量:如'A'...
主要介绍了浅谈Java多线程编程中Boolean常量的同步问题,主要针对线程之间同步了不同的布尔对象的问题,需要的朋友可以参考下
关于在keil c51中如何定位变量、常数和函数的位置
在C#中定义常量的方式有两种,一种叫做静态常量(Compile-time constant),另一种叫做动态常量(Runtime constant)。前者用“const”来定义,后者用“readonly”来定义。 对于静态常量(Compile-time constant),...