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. .NET读取Project 2007 MPP项目文件

    Project文件读取: 方法1:Microsoft.Project.OLEDB.11.0 string strConn = "Provider=Microsoft.Project.OLED ...

  2. GridView.GridLines 属性

    GridLines.None 不显示网格线. GridLines.Horizontal 仅显示水平网格线. GridLines.Vertical 仅显示垂直网格线. GridLines.Both 同时 ...

  3. Javascript知识——事件

    O(∩_∩)O~~又是新的一周开始了,今天还是在继续学习Javascript知识,今天主要讲了事件的知识.现在就总结下吧. 事件 事件一般是用于浏览器和用户操作进行交互.最早是 IE 和 Netsca ...

  4. 创建一个支持异步操作的operation

    NSOperationQueue时iOS中常用的任务调度机制.在创建一个复杂任务的时候,我们通常都需要编写NSOperation的子类.在大部分情况下,重写main方法就可以满足要求.main方法执行 ...

  5. class A<T> where T:class 这个泛型类中的Where T:class什么意思

    这是类型参数约束,.NET支持的类型参数约束有以下五种: where T : struct                               T必须是一个结构类型 where T : cla ...

  6. Delphi 2010下载+完美破解

    点击链接进入http://altd.embarcadero.com/download/RADStudio2010/delphicbuilder_2010_3615_win.isoRAD Studio/ ...

  7. [C语言练习]学生学籍管理系统

    /** * @copyright 2012 Chunhui Wang * * wangchunhui@wangchunhui.cn * * 学生学籍管理系统(12.06) */ #include &l ...

  8. 安装AppManager

    http://www.searchvirtual.com.cn/showcontent_66884.htm

  9. Html小插件

    1.天气预报插件 效果图: 源代码: <iframe width="650" scrolling="no" height="60" f ...

  10. 使用netty构建一个socks proxy

    使用netty构建一个socks proxy   最近在做的项目,需要自己搭建一个socks代理.netty4.0附带了一个socks代理的样例,但是3.x就没有这个东西了,碰巧使用的又是3.7,就只 ...