`
Aga
  • 浏览: 218573 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

在amid时写的一个线程同步的东西

    博客分类:
  • J2SE
阅读更多
控制器,负责与客户端通讯,并且控制着另外12家线程的
package com.amid.entryexit;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;

public class Controller extends Thread {

	private Socket socket;

	private StoreOneQuote[] threads;

	private BufferedReader in;

	private PrintWriter out;

	private String regEx;

	public Controller(Socket socket, StoreOneQuote[] threads)
			throws IOException {
		regEx = "END|((STOP|START) [0-9]+)";
		this.socket = socket;
		this.threads = threads;
		in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
		//auto-flush
		out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket
				.getOutputStream())), true);
	}

	public void run() {
		String request = "";
		String response = "";
		try {
			while (!"END".equals(request)) {
				request = in.readLine();
				response = request;
				if (request.matches(regEx)) {
					if ("END".equals(request)) {// end the session between the
												// server and the client
						response = "OK, end this session, byebye";
					} else {// STOP || START
						String[] order = new String[2];
						order = request.split(" ");
						int companyNumber = new Integer(order[1]);
						if (companyNumber < threads.length
								&& companyNumber >= 0) {
							if ("STOP".equals(order[0])) {
								response = threads[companyNumber].block();
							} else if ("START".equals(order[0])) {
								response = threads[companyNumber].wakeUp();
							}
						} else {
							response = "Error: Parameter Out Of Bound";
						}
					}
				} else {
					response = "Error: Unknown Request";
				}
				System.out.println("Client's Request: " + request);
				out.println(response);
			}// End of while
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				socket.close();
			} catch (IOException e) {
			}
		}
	}
}

12个被控制的线程
package com.amid.entryexit;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Random;

public class StoreOneQuote extends Thread {
	private Connection conn = null;
	
	private int sleepTime = 10;
	
	private boolean flag = false;//not wait();

	public StoreOneQuote(Connection conn, int sleepTime) {
		this.sleepTime = sleepTime;
		this.conn = conn;
	}
	
	private synchronized void getValuesFromAPI(ArrayList list){
		if(flag){
			try {
				this.wait();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		Random r = new Random();
		list.add(new Integer(Thread.currentThread().getName()));
		list.add(r.nextInt(6));
		list.add(r.nextInt(2));
		list.add(r.nextInt(100));
		list.add(r.nextFloat() + 1);
	}
	
	public synchronized String wakeUp(){
		if(flag == true){
			flag = false;
			this.notifyAll();
			return "OK: The Thread had run successfully.";
		} else {
			return "WARNING: The Thread is running now.";
		}
	}
	/**
	 * @return true means ok
	 * 		   false means a warn
	 */
	public String block(){
		if(flag == true){
			return "WARNING: The Thread had already been locked.";
		} else {
			flag = true;
			return "OK: The Thread had been blocked successfully.";
		}
	}
	
	private String getDate(){
		Date now = new Date();
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		return sdf.format(now);
	}
	
	public void run() {
		while (!Thread.currentThread().isInterrupted()) {//legacy, no use
			String sql = "";
			sql += "INSERT INTO quote (company_id, product_id, quote_type, quote_amount, quote_price, quote_time) ";
			sql += "VALUES (?, ?, ?, ?, ?, ?); ";
			ArrayList list = new ArrayList();
			getValuesFromAPI(list);
			try {
				PreparedStatement pstmt = conn.prepareStatement(sql);
				for (int i = 1; i < list.size(); i++) {
					pstmt.setInt(i, (Integer)list.get(i - 1));
				}
				pstmt.setFloat(5, (Float)list.get(4));
				pstmt.setString(6, getDate());
				if(new Random().nextBoolean()){
					pstmt.execute();
					System.out.println(Thread.currentThread().getName());
				}
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			try {
				Thread.sleep(sleepTime);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				Thread.currentThread().interrupt();
				e.printStackTrace();
			}
		}
	}

}


package com.amid.entryexit;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

public class StoreQuote {
	Connection conn = null;

	String url = "jdbc:mysql://211.94.206.60:3306/entryexit_v15";

	String userName = "entryexit";

	String password = "entryexit";

	int sleepTime = 4000;

	int companyAmount = 10;

	int serverPort = 7999;

	int socketTimeOut = 60000;

	private void setProperties() {
		Properties prop = new Properties();
		try {
			prop.load(new FileInputStream(System.getProperty("user.dir")
					+ "\\app.properties"));
			url = prop.getProperty("url");
			userName = prop.getProperty("userName");
			password = prop.getProperty("password");
			sleepTime = new Integer(prop.getProperty("sleepTime"));
			companyAmount = new Integer(prop.getProperty("companyAmount"));
			serverPort = new Integer(prop.getProperty("serverPort"));
			socketTimeOut = new Integer(prop.getProperty("socketTimeOut"));
		} catch (FileNotFoundException ex) {
			ex.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	private void getReady4DB() {
		try {
			Class.forName("com.mysql.jdbc.Driver");
			conn = DriverManager.getConnection(url, userName, password);
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

	private StoreOneQuote[] getReady4TH(int threadAmount) {
		StoreOneQuote[] threads = new StoreOneQuote[threadAmount];
		for (int i = 0; i < threadAmount; i++) {
			threads[i] = new StoreOneQuote(conn, sleepTime);
			threads[i].setName(Integer.toString(i));
			threads[i].start();
		}
		return threads;
	}

	public void monitorThread(StoreOneQuote[] threads, int serverPort) {
		ServerSocket server = null;
		Socket socket = null;
		try {
			server = new ServerSocket(serverPort);
			while (true) {
				socket = server.accept();
				socket.setSoTimeout(socketTimeOut);
				Controller ctrl = new Controller(socket, threads);
				ctrl.start();
			}
		} catch (IOException e) {
			try {
				if (!server.isClosed())
					server.close();
				if (!socket.isClosed())
					socket.close();
			} catch (IOException ex) {
				ex.printStackTrace();
			}

			e.printStackTrace();
		}
	}

	private void startUp() {
		setProperties();
		getReady4DB();
		StoreOneQuote[] threads = getReady4TH(companyAmount);
		monitorThread(threads, serverPort);
	}

	public static void main(String[] args) {
		StoreQuote sq = new StoreQuote();
		sq.startUp();
	}

	private void closeConn() {
		try {
			if (conn != null) {
				conn.close();
			}
		} catch (SQLException e) {
			e.printStackTrace();

		}
	}
}






  


  
分享到:
评论

相关推荐

    AMID

    AMID,全称为Asynchronous Module Definition,是一种在JavaScript中实现模块化编程的规范。它主要解决了JavaScript在浏览器环境中缺少内置模块系统的问题,使得代码组织更加有序,可维护性更强。AMID规范允许开发者...

    US industrial output fell amid chip shortage and hurricane.pdf

    2. 芯片短缺影响:半导体供应不足是导致制造业生产下降的一个关键因素。由于全球芯片短缺,特别是汽车和零部件制造领域,产量下降了7.2%。这表明半导体供应链的问题继续困扰着工业活动,尤其是在汽车行业。 3. 飓风...

    amidGUI:AMID Rest 接口前端

    图形用户界面 AMID 休息接口的前端 在apache的httpd.conf中启动AMID并配置反向代理 埃斯: ProxyPass /mongo ProxyPassReverse /mongo

    算法的答案

    总结来说,第一个程序展示了如何在不完全合并两个已排序数组的情况下找到它们的中位数,利用了二分查找的思想和边界调整策略,这是一种高效的解决方案。第二个程序由于信息不足,无法进行详细的解释和分析。

    Synthese eines hexanuklearen Calcium-Phosphor-Käfigs über heteroleptische Calcium-amid-phosphanid-Vorstufen

    Synthese eines hexanuklearen Calcium-Phosphor-Käfigs über heteroleptische Calcium-amid-phosphanid-Vorstufen Synthese eines hexanuklearen Calcium±Phosphor-KaÈfigs uÈ ber heteroleptische Calcium-...

    求2n个数的中位数

    3. **终止条件**: 当两个数组都只剩下两个元素时,退出循环。 4. **输出结果**: 输出这两个剩余区间中的较大值和较小值。 #### 五、代码示例 ```java public class SearchMid { static void SearchMid(int[] a, ...

    Sketch-Title-Case:使用Sketch插件制作文本Title Case

    标题大小写是指每个单词的首字母大写,但某些小单词(如冠词和简短介词)除外。 是一篇很好的文章,解释了为什么您应该考虑使用它。 排除大写的单词的完整列表 a, abaft, about, above, afore, after, along, amid, ...

    无线视频传输QoS优化研究——以Android手机为例.pdf

    在对AMID算法进行改进时,研究者们提出了一种结合丢包率和接收缓冲区使用情况的改进算法,目的在于在网络状况良好时能充分使用带宽,而在网络状况不佳时则能够有效降低丢包率,改善视频传输的质量。 实验结果表明,...

    Silber(I)-di(arensulfonyl)amide und ein Silber(I)-(arensulfonyl)(alkansulfonyl)amid: Von Bändern zu lamellaren Schichten mit kurzen Zwischenschichtkontakten C-H[hellip]Hal-C oder C-Br[hellip]Br-C

    Silber(I)-di(arensulfonyl)amide und ein Silber(I)-(arensulfonyl)(alkansulfonyl)amid: Von Bändern zu lamellaren Schichten mit kurzen Zwischenschichtkontakten C-H[hellip]Hal-C oder C-Br[hellip]Br-C ...

    计算机课程实习报告.doc

    程序首先定义了一个名为`rip`的结构体,包含目的网络地址数组`amid`、子网掩码数组`subnet`、下一跳地址字符数组`next`以及辅助的`sub`数组。`main()`函数中初始化了一个`rip`结构体实例`r`,包含了四个路由条目。 ...

    python-2.7.10.amd64.msi.asc

    大数据开发编程语言,使用Python快速生成程序的原型(有时甚至是程序的最终界面),然后对其中有特别要求的部分,用更合适的语言改写,比如3D游戏中的图形渲染模块,性能要求特别高,就可以用C/C++重写,而后封装为...

    新编大学英语第一册Unit4浙大版PPT课件.pptx

    这个单元以“Fresh Start”为主题,引导学生思考大学生活的意义和可能性,同时也为他们提供了一个审视自我、规划未来的机会。 在课程的开头,引用了W.E.B. DuBois的话:“And yet not a dream, but a mighty ...

    介词用法及练习.doc

    - amid/amidst和among:用于表示在群体中,amidst更强调包围感。 三、介词的用法举例: - 时间:The bus will be here in ten minutes.(公交车十分钟后到。) - 地点:He works at Peking University.(他在北京...

    WhenYouAreOld当你老了精选.doc

    诗的第一部分描绘了一个老年场景:主人公在炉火旁昏昏欲睡,此时他/她被邀请翻开一本书,回忆起年轻时的自己。"When you are old and grey and full of sleep" 这句诗,形象地刻画了衰老的外貌和状态,暗示着时间的...

    计算机课程实习报告.docx

    - 报告中提到在特定情况下(与第三个目的网络匹配时),下一跳被输出两次,这可能是由于`switch`语句条件判断的问题,需要调试和完善代码逻辑。 4. 实习体会: - 实习过程不仅提升了C语言编程能力,还加深了对...

    实现基于Asterisk云呼平台的多账户配置

    总之,实现基于Asterisk的多账户配置是一项涉及多个层面的工作,需要深入理解Asterisk的架构和配置机制,并确保在安全性和性能上达到预期标准。通过灵活地利用Asterisk的功能,可以创建出满足不同需求的云呼平台。

    LCD DRIVER AD1268A

    AD1268A是一款由美国AMID公司设计与制造的LCD驱动器芯片。该芯片因其低廉的价格和可靠的性能,在市场中占据了一席之地。它可以驱动128段的LCD,并且提供了丰富的配置选项以适应不同的应用需求。 #### 二、技术参数 ...

    Module 3 Interpersonal Relationships-Friendship课件.ppt

    在友谊中,拥有一个真正的朋友本身就是一种特权。 6. pilgrim - 朝圣者;比喻为寻求真理和自我发现的人,朋友可能在人生的旅程中扮演这样的角色。 7. glowing - 光辉的;形容一种积极的、充满活力的友谊状态。 8. ...

    23条英语一句话绕口令

    重点在于区分每一个“wish”的含义:第一个“wish”是动词,意为“希望”,后面的则是名词,意为“愿望”。同时,“witch”与“wish”发音相近,练习时需注意区分。 ### 3. I scream, you scream, we all scream ...

    2021 地产科技企业50强 -kpmg.pdf

    文档提到了“2021 地产科技企业50强 -kpmg.pdf”,这表明该文件很可能涉及了一个由知名咨询公司毕马威(KPMG)组织的关于地产科技企业的评选活动。虽然没有具体内容提供,但可以推测评选活动旨在识别和表彰在地产科技...

Global site tag (gtag.js) - Google Analytics