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的更多相关文章

  1. Java多线程 Socket使用

    点我跳过黑哥的卑鄙广告行为,进入正文. Java多线程系列更新中~ 正式篇: Java多线程(一) 什么是线程 Java多线程(二)关于多线程的CPU密集型和IO密集型这件事 Java多线程(三)如何 ...

  2. java多线程(二)之实现Runnable接口

    一.java多线程方式2: 实现Runnable接口 好处:a. 可以避免由于java单继承带来的局限性. b. 适合多个相同的程序的代码去处理同一个资源的情况, 把线程与程序的代码, 数据有效分离, ...

  3. Java多线程带返回值的Callable接口

    Java多线程带返回值的Callable接口 在面试的时候,有时候是不是会遇到面试会问你,Java中实现多线程的方式有几种?你知道吗?你知道Java中有可以返回值的线程吗?在具体的用法你知道吗?如果两 ...

  4. Java多线程基础知识例子

    一.管理 1.创建线程 Thread public class Main { public static void main(String[] args) { MyThread myThread = ...

  5. Java 多线程Socket编程通讯--实现聊天室代码

    1.创建服务器类 import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; import ja ...

  6. 探Java多线程Thread类和Runnable接口之间的联系

    首先复习一下Java多线程实现机制,Java实现多线程方法有如下这么几种: 1.继承了(extends)Thread类 2.实现了(implements)Runnable接口 也就是说  有如下两种情 ...

  7. Java多线程Socket在控制台输出的多人聊天室编程

    服务器端代码 import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; import java ...

  8. Java 多线程(1)-Thread和Runnable

    一提到Java多线程,首先想到的是Thread继承和Runnable的接口实现 Thread继承 public class MyThread extends Thread { public void ...

  9. java多线程启动的方法runnable和callable

随机推荐

  1. 【译】html5游戏入门

    [译]html5游戏入门 原文链接 简介 如果你想用canvas做个游戏,那么来对地方了. 但是但是你至少知道javascript怎么拼写(╯‵□′)╯︵┻━┻ 既然没问题,那先来玩一下或者下载 创建 ...

  2. 今年暑假不AC1

    Description "今年暑假不AC?"  "是的."  "那你干什么呢?"  "看世界杯呀,笨蛋!"  " ...

  3. Java基础之"=="和 和 equals 方法的区别

    一."=="操作符 ==操作符专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所存储的数值是否相同,要比较两个基本类型的数据或两个引用变量是否相等,只能用==操作 ...

  4. YII与Ace Admin 的集成

    目录 一. 前言... 1 二.为什么要使用YII+ace. 1 三.新建YII模块... 1 四.如何修改模板... 3 五.注意的地方... 4 六.整合的不足之处... 4 一. 前言 yii- ...

  5. day6_python学习笔记_chapter8_条件,循环

    1. if elif else 2. 条件表达式:三元操作符: smaller = x if x < y else y   == if x < y : smaller =x  else : ...

  6. R与数据分析旧笔记(十四) 动态聚类:K-means

    动态聚类:K-means方法 动态聚类:K-means方法 算法 选择K个点作为初始质心 将每个点指派到最近的质心,形成K个簇(聚类) 重新计算每个簇的质心 重复2-3直至质心不发生变化 kmeans ...

  7. grunt api 文档

    Grunt docs Grunt和 Grunt 插件是通过 npm 安装并管理的,npm是 Node.js 的包管理器. 安装 grunt-cli npm install grunt-cli -g 注 ...

  8. Java图形化界面设计——布局管理器之FlowLayout(流式布局)

    一.布局管理器所属类包 所属类包 布局管理器名称 说明 Java.awt FlowLayout(流式布局) 组件按照加入的先后顺序按照设置的对齐方式从左向右排列,一行排满到下一行开始继续排列 Bord ...

  9. swift菜鸟入门视频教程-03-字符串和字符

    本人自己录制的swift菜鸟入门,欢迎大家拍砖.有什么问题能够在这里留言. 主要内容: 字符串字面量 初始化空字符串 字符串可变性 字符串是值类型 使用字符 计算字符数量 连接字符串和字符 字符串插值 ...

  10. 取文件的大小 (KB,MB,GB...)

    取文件的大小 (KB,MB,GB...) 2种方式: VB 和 C# 1,  VB Public Function GetFileSize(ByVal iFileSizeKB As Long) As ...