Java 多线程 socket 取款例子 runnable callable
socket部分参考 http://blog.csdn.net/kongxx/article/details/7259465
取款部分参考 http://blog.csdn.net/dayday1987/article/details/9971647
先说说取款吧 如何保证数据同步? 操作时加锁即可 怎么加?使用synchronized关键字
然后自己设置两个线程 一个add 一个withdraw即可(原博中只用到了Runnable 感觉并没有创建新线程 这里有点小疑问)
socket部分 每次server.accpet()之后都会返回一个客户端 Server端需要创建一个新的线程 将客户端放入该新thread中处理就行
所以这里模拟的一个客户端专门存 一个专门取
Server端
package com.googlecode.garbagecan.test.socket.sample2; import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors; import com.accout.Operation;
/**
* http://blog.csdn.net/kongxx/article/details/7259465
* @author Administrator
*
*/
public class MyServer {
static Operation oper;
public static void main(String[] args) throws IOException {
oper = new Operation();
MyServer ms=new MyServer(); ServerSocket server = new ServerSocket(12345); while (true) {
Socket socket = server.accept();
System.out.println("a new conntection ---------------");
ms.invoke(socket);
}
} private static void invoke(final Socket client) throws IOException {
new Thread(new Runnable() {
public void run() {
BufferedReader in = null;
PrintWriter out = null;
try {
in = new BufferedReader(new InputStreamReader(client.getInputStream()));
out = new PrintWriter(client.getOutputStream()); while (true) {
String msg = in.readLine();
if (msg==null||msg.equals("bye")) {
break;
}
System.out.println("client says "+msg);
String val[]=getParam(msg);
//msg1 add
if(val[0].equals("1")){
msg=oper.addOperationCall(val[1],Integer.parseInt(val[2]));
}else if(val[0].equals("2")){
msg=oper.withDrawOperationCall(val[1],Integer.parseInt(val[2]));
}
//send msg to client
out.println(msg);
out.flush();
}
} catch(IOException ex) {
ex.printStackTrace();
} catch (NumberFormatException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
in.close();
} catch (Exception e) {}
try {
out.close();
} catch (Exception e) {}
try {
client.close();
} catch (Exception e) {}
}
}
}).start();
} static String[] getParam(String msg){
String val[]=msg.split(" ");
return val;
}
}
取客户端
package com.googlecode.garbagecan.test.socket.sample2; import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket; public class MyClientLoopDraw {
public static void main(String[] args) throws Exception {
Socket socket = new Socket("localhost", 12345);
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
BufferedReader readConsole = new BufferedReader(new InputStreamReader(System.in));
PrintWriter out = new PrintWriter(socket.getOutputStream());
int index=0;
while (true) {
//暂时规定1 就是add 2就是取钱
// String msg = readConsole.readLine();
//读取控制台的信息(并加上名字)并发给Server
//some codes to handle msg
String msg="2 jerry 150 -";
System.out.println(msg);
out.println(msg);
out.flush();
System.out.println("Server says "+in.readLine());
if (msg.equals("bye")||index++>=10) {
break;
} }
socket.close();
}
}
存客户端
package com.googlecode.garbagecan.test.socket.sample2; import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket; public class MyClientLoopAdd {
public static void main(String[] args) throws Exception {
Socket socket = new Socket("localhost", 12345);
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
BufferedReader readConsole = new BufferedReader(new InputStreamReader(System.in));
PrintWriter out = new PrintWriter(socket.getOutputStream());
int index=0;
while (true) {
//暂时规定1 就是add 2就是取钱
//String msg = readConsole.readLine();
//读取控制台的信息(并加上名字)并发给Server
//some codes to handle msg
String msg="1 tom 100 +";
System.out.println(msg);
out.println(msg);
out.flush();
System.out.println("Server says "+in.readLine());
if (msg.equals("bye")||index++>10) {
break;
} }
socket.close();
}
}
创建操作类 方法中创建新的线程来处理存钱和取钱
package com.accout; import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future; public class Operation { Account account = new Account(); public void addOperation(final String name, final float varient) { // 加载线程
new Thread(new Runnable() { @Override
public void run() {
try {
Thread.sleep(1000);
} catch (Exception e) {
e.printStackTrace();
}
// 存钱
getAccount().add(name, varient);
} }).start();
// new Runnable() {
//
// @Override
// public void run() {
// try {
// Thread.sleep(1000);
// } catch (Exception e) {
// e.printStackTrace();
// }
// // 存钱
// getAccount().add(name, varient);
// }
//
// }.run(); // 别忘了加run()
} public void withdrawOperation(final String name, final float varient) { // 加载线程
new Runnable() {
@Override
public void run() {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
// 取钱
getAccount().withdraw(name, varient);
} }.run();
} public String addOperationCall(final String name, final float varient)
throws Exception {
ExecutorService threadPool = Executors.newSingleThreadExecutor();
Future<String> future = threadPool.submit(new Callable<String>() {
@Override
public String call() throws Exception {
// TODO Auto-generated method stub
return getAccount().add(name, varient);
}
});
String rs = null;
try {
Thread.sleep(1000);// 可能做一些事情
rs = future.get();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
return rs; } public String withDrawOperationCall(final String name, final float varient)
throws Exception {
ExecutorService threadPool = Executors.newSingleThreadExecutor();
Future<String> future = threadPool.submit(new Callable<String>() {
@Override
public String call() throws Exception {
// TODO Auto-generated method stub
return getAccount().withdraw(name, varient);
}
});
String rs = null;
try {
Thread.sleep(1000);// 可能做一些事情
rs = future.get();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
return rs; } public Account getAccount() {
return account;
} public void setAccount(Account account) {
this.account = account;
}
}
Java 多线程 socket 取款例子 runnable callable的更多相关文章
- Java多线程 Socket使用
点我跳过黑哥的卑鄙广告行为,进入正文. Java多线程系列更新中~ 正式篇: Java多线程(一) 什么是线程 Java多线程(二)关于多线程的CPU密集型和IO密集型这件事 Java多线程(三)如何 ...
- java多线程(二)之实现Runnable接口
一.java多线程方式2: 实现Runnable接口 好处:a. 可以避免由于java单继承带来的局限性. b. 适合多个相同的程序的代码去处理同一个资源的情况, 把线程与程序的代码, 数据有效分离, ...
- Java多线程带返回值的Callable接口
Java多线程带返回值的Callable接口 在面试的时候,有时候是不是会遇到面试会问你,Java中实现多线程的方式有几种?你知道吗?你知道Java中有可以返回值的线程吗?在具体的用法你知道吗?如果两 ...
- Java多线程基础知识例子
一.管理 1.创建线程 Thread public class Main { public static void main(String[] args) { MyThread myThread = ...
- Java 多线程Socket编程通讯--实现聊天室代码
1.创建服务器类 import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; import ja ...
- 探Java多线程Thread类和Runnable接口之间的联系
首先复习一下Java多线程实现机制,Java实现多线程方法有如下这么几种: 1.继承了(extends)Thread类 2.实现了(implements)Runnable接口 也就是说 有如下两种情 ...
- Java多线程Socket在控制台输出的多人聊天室编程
服务器端代码 import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; import java ...
- Java 多线程(1)-Thread和Runnable
一提到Java多线程,首先想到的是Thread继承和Runnable的接口实现 Thread继承 public class MyThread extends Thread { public void ...
- java多线程启动的方法runnable和callable
随机推荐
- Objective-C时间戳转换的转换和时间
什么是时间戳? 时间戳(timestamp),一般是一个字符序列.唯一地标识某一刻的时间.数字时间戳技术是数字签名技术一种变种的应用. 思考:简单来讲就是依据文件hash加密后生成的摘要和时间生成的时 ...
- Spring——jar包详解
org.springframework.aop ——Spring的面向切面编程,提供AOP(面向切面编程)的实现 org.springframework.asm——spring 2.5.6的时候需要a ...
- [学习笔记]viewport定义,弹性布局,响应式布局
一,移动端宽度设置viewport视图窗口,<meta name="viewport" content="width=device-width,initial-sc ...
- Android程序捕获未处理异常,处理与第三方方法冲突时的异常传递
自己的android程序对异常进行了处理,用的也是网上比较流行的CrashHandler,代码如下,就是出现了未处理的异常程序退出,并收集收集设备信息和错误信息仪器保存到SD卡,这里没有上传到服务器. ...
- Linux分区方案
创建三个分区 1./boot 启动分区 存放内核和启动程序 空间分配:100M 类型:ext4 2./swap 交换分区 虚 ...
- R与数据分析旧笔记(三)不知道取什么题目
连线图 > a=c(2,3,4,5,6) > b=c(4,7,8,9,12) > plot(a,b,type="l") 多条曲线效果 plot(rain$Toky ...
- 经常会用到的js函数
//获取样式function getStyle(obj,attr){ if(obj.currentStyle){ return obj.currentStyle[attr]; }else{ re ...
- java简易编辑器
package peng_jun; import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swi ...
- JSTL与EL常用标签(转)
JSTL与EL EL相关概念 JSTL一般要配合EL表达式一起使用,来实现在jsp中不出现java代码段.所以我们先来学习EL表达式 EL主要用于查找作用域中的数据,然后对它们执行简单操作:它不是编程 ...
- 《转》java动态代理(JDK和cglib)
该文章转自:http://www.cnblogs.com/jqyp/archive/2010/08/20/1805041.html JAVA的动态代理 代理模式 代理模式是常用的java设计模式,他的 ...