`
snake_hand
  • 浏览: 584877 次
社区版块
存档分类
最新评论

JAVA实现网络编程之并发编程

 
阅读更多

一.并发与并行

    个人理解并发就是在时间上运行程序(即不同任务在不同时间片上运行),并行就是在空间上运行程序(即不同任务在不同处理器或计算机上运行)。

 

二.Java中的Thread类

    1.Thread类通过实现Runnable接口

    2.线程池(ThreadPool)用来管理线程的数量

    我们先用一个例子实现:

       1.创建并启动100个线程,每个线程都往同一个账户添加一元。

       2.定义一个名为Account类模拟账户,一个名为AddAYuanTask的类用来向账户里添加一元。

       程序如下

第一版Account
 1 import java.util.concurrent.*;
 2 
 3 public class AccountWithoutSync {
 4     private static Account account = new Account();
 5     
 6     public static void main(String[] args)
 7     {
 8         ExecutorService executor = Executors.newCachedThreadPool();
 9         
10         for(int i = 0; i < 100; i++)
11         {
12             executor.execute(new AddOneYuanTask());
13         }
14         
15         executor.shutdown();
16         
17         while(!executor.isTerminated())
18         {
19             
20         }
21         
22         System.out.println("What is balance? " + account.getBalance());
23     }
24     
25     //Inner class
26     private static class AddOneYuanTask implements Runnable
27     {
28         public void run()
29         {
30             account.deposit(1);
31         }
32     }
33     
34     private static class Account
35     {
36         private int balance = 0;
37         
38         public int getBalance()
39         {
40             return balance;
41         }
42         
43         public void deposit(int amount)
44         {
45             int newBalance = balance + amount;
46             
47                         //人为地制造延时  
48             try
49             {
50                 Thread.sleep(5);
51             }
52             catch(InterruptedException ex)
53             {
54             }
55             
56             balance = newBalance;
57         }
58     }
59 }

   我们运行一下发现balance为4或5,这是个错误的结果,如果一个类的对象在多线程程序中导致竞争状态,则称这个类为线程不安全的。所以这个任务是线程不安全的。

三.用同步完善程序

   用互斥锁来实现同步,即在一任务开始执行时加锁,执行完毕后释放锁。在释放锁之前其它任务无法执行。同步完全可以避免竞争状态的产生,但有的时候还需要线程之间的相互合作。

   然后增加一个向账户提款(Withdraw)的任务,当余额小于取款数时,等待新存入的存款。

   Account类添加

   private static Lock lock = new ReentrantLock();  //创建一个锁

   private static Condition newDeposit = lock.newCondition();  //实现一个条件

    Account类中应用互斥锁的的方法如下

withdraw和deposit

   然后程序相应的修改修改

第二版Account
 1     public static void main(String[] args)
 2     {
 3         System.out.println("Thread 1\t\tThread 2\t\tBalance");
 4         
 5         ExecutorService executor = Executors.newFixedThreadPool(2);
 6         executor.execute(new DepositTask());
 7         executor.execute(new WithdrawTask());
 8         executor.shutdown();
 9     }
10     
11     
12     public static class DepositTask implements Runnable
13     {
14         public void run()
15         {
16             try
17             {
18                 while(true)
19                 {
20                     account.deposit((int)(Math.random() * 10) + 1);
21                     Thread.sleep(1000);
22                 }
23             }
24             catch(InterruptedException ex)
25             {
26                 ex.printStackTrace();
27             }
28         }
29     }
30     
31     public static class WithdrawTask implements Runnable
32     {
33         public void run()
34         {
35             while(true)
36             {
37                 account.withdraw((int)(Math.random() * 10) + 1);
38             }
39         }
40     }

 

四.客户端/服务器的网络应用

    Java中对socket的使用十分方便,在建立socket连接后就可以使用输入输出流的方法实现数据传输了。

    在实现基本的GUI后,在服务器用一个判断条件永远为true的循环来监听客户端的连接请求(Socket socket = serverSocket.accept();

    服务器通过创建一个内部类(HandleAClient),把客服端的socket传递过来执行。

HandleAClient类
 1     class HandleAClient implements Runnable
 2     {
 3         //A connected socket
 4         private Socket socket;
 5         
 6         /**Construct a thread */
 7         public HandleAClient(Socket socket)
 8         {
 9             this.socket = socket;
10         }
11         
12         /**Run a thread */
13         public void run()
14         {
15             try
16             {
17                 //Create data input and output streams
18                 DataInputStream inputFromClient = new DataInputStream(
19                         socket.getInputStream());
20                 DataOutputStream outputToClient = new DataOutputStream(
21                         socket.getOutputStream());
22                 int order = 0;
23                 double amount;
24                 //Continuously serve the client
25                 while(order != 4)
26                 {
27                     //Receive order, amount from the client
28                     order = inputFromClient.readInt();
29                     amount = inputFromClient.readDouble();
30                     
31                     if(order == 1)
32                     {
33                         outputToClient.writeDouble(account.getBalance());
34                     }
35                     else if(order == 2)
36                     {
37                         account.withdraw(amount);
38                         outputToClient.writeDouble(account.getBalance());
39                     }
40                     else if(order == 3)
41                     {
42                         account.deposit(amount);
43                         outputToClient.writeDouble(account.getBalance());
44                     }
45                     
46                     jta.append("Order received from client: "+
47                             order + '\n');
48                     jta.append("Balance is " + account.getBalance() + '\n');
49                 }
50             }
51             catch(IOException e)
52             {
53                 System.err.println(e);
54             }
55         }
56     }

    而客户端连接上服务器后,创建两个IO流

    //IO streams
    DataOutputStream toServer = new DataOutputStream(socket.getOutputStream());

    DataInputStream fromServer = new DataInputStream(socket.getInputStream());

 即可传输order(菜单选项)和amount

    //Send the order, amount to the server
    toServer.writeInt(order);
    toServer.writeDouble(amount);
    toServer.flush();

   最后再读取balance

   balance = fromServer.readDouble();

 

 

分享到:
评论

相关推荐

    java并发编程2

    java并发编程pdf文档第二部分:Java并发编程实战.pdf、Java多线程编程核心技术.pdf、实战Java高并发程序设计.pdf

    Java网络编程案例教程习题参考答案 .pdf

    Java_network_programming是Java编程语言中一个基础组件,用于实现网络通信。以下是Java网络编程案例教程习题参考答案中涉及到的知识点: 1. Socket编程:Socket是Java网络编程中最基本的组件,用于实现网络通信。...

    java并发编程艺术

    java并发编程艺术java并发编程艺术java并发编程艺术java并发编程艺术java并发编程艺术

    Java后端开发,JUC并发编程Java后端开发,JUC并发编程

    Java后端开发,JUC并发编程Java后端开发,JUC并发编程Java后端开发,JUC并发编程Java后端开发,JUC并发编程Java后端开发,JUC并发编程Java后端开发,JUC并发编程Java后端开发,JUC并发编程Java后端开发,JUC并发编程...

    java并发编程

    java并发编程java并发编程java并发编程java并发编程java并发编程

    Java 并发核心编程

    自从java创建以来就已经支持并发的理念,如线程和锁。这篇指南主要是为帮助java多线程开发人员理解并发的核心概念以及如何应用这些理念。本文的主题是关于具有java语言风格的Thread、synchronized、volatile,以及...

    Java高并发编程,构建并发编程知识体系,提升面试成功率

    Java高并发编程,构建并发编程知识体系,提升面试成功率,完整版17章视频教程下载。 本课程将结合大量图示及代码演示,带你掌握多线程并发编程(线程安全,线程调度,线程封闭,同步容器等)与高并发处理思路与手段...

    java并发编程和网络高级编程pdf

    java并发编程实践pdf扫描版本和java高级网络编程一起打包,感觉这两本书籍很不错,详细的介绍了并发编程的原理以及concurrency中类的用法, 能够满足日常编程需要。

    java NIO和java并发编程的书籍

    java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java...

    JAVA并发编程艺术 高清pdf

    JAVA并发编程艺术 高清pdf : 1.并发变成的挑战 2. java并发机制的底层实现原理 3. java 内存模型 4. java并发编程基础 5.java中的锁。。。。。。。

    java并发编程实战源码,java并发编程实战pdf,Java

    java并发编程实战源码 附有本书所有源码,maven 导入 eclipse或idea

    《Java并发编程的艺术》

    《Java并发编程的艺术》内容涵盖Java并发编程机制的底层实现原理、Java内存模型、Java并发编程基础、Java中的锁、并发容器和框架、原子类、并发工具类、线程池、Executor框架等主题,每个主题都做了深入的讲解,同时...

    Java并发编程实战华章专业开发者书库 (Tim Peierls 等 美Brian Goetz).pdf

    《Java并发编程实战》是一本深入探讨Java平台并发编程的权威指南,由Tim Peierls等人与Brian Goetz合著,旨在帮助Java开发者理解和掌握在多线程环境中编写高效、安全的代码。这本书由拥有丰富经验的JDK并发大师及...

    Java网络编程实践课程设计报告.pdf

    Java 网络编程可以实现客户端/服务器端的通信、数据传输、网络资源共享等功能。 knowledge point 2: Socket 编程 Socket 编程是 Java 网络编程的核心技术之一。Socket 是一种网络通信机制,允许不同的应用程序...

    java并发编程实战中文加英文版加源码

    JAVA并发编程实践中文版 英文版 原书源码 带书签 java_concurrency_in_practice.pdf 英文版还是不错的,但是中文版的译者典型的没有技术功底,介绍上说什么专家, 翻译的非常差劲,有些句子都不通顺,都不知道自己去...

    java并发编程内部分享PPT

    java并发编程内部分享PPT

    《java 并发编程实战高清PDF版》

    深入讲解java并发编程技术,多线程、锁以及java内存模型等

    62-Java并发编程实战

    62-Java并发编程实战62-Java并发编程实战62-Java并发编程实战62-Java并发编程实战62-Java并发编程实战62-Java并发编程实战62-Java并发编程实战62-Java并发编程实战62-Java并发编程实战62-Java并发编程实战62-Java...

    JAVA并发编程实践

    《JAVA并发编程实践》随着多核处理器的普及,使用并发成为构建高性能应用程序的关键。Java 5以及6在开发并发程序中取得了显著的进步,提高了Java虚拟机的性能以及并发类的可伸缩性,并加入了丰富的新并发构建块。在...

    Java并发编程常识

    Java并发编程常识 Java并发编程常识 Java并发编程常识

Global site tag (gtag.js) - Google Analytics