一.并发与并行
个人理解并发就是在时间上运行程序(即不同任务在不同时间片上运行),并行就是在空间上运行程序(即不同任务在不同处理器或计算机上运行)。
二.Java中的Thread类
1.Thread类通过实现Runnable接口
2.线程池(ThreadPool)用来管理线程的数量
我们先用一个例子实现:
1.创建并启动100个线程,每个线程都往同一个账户添加一元。
2.定义一个名为Account类模拟账户,一个名为AddAYuanTask的类用来向账户里添加一元。
程序如下
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类中应用互斥锁的的方法如下
然后程序相应的修改修改
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传递过来执行。
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并发编程pdf文档第二部分:Java并发编程实战.pdf、Java多线程编程核心技术.pdf、实战Java高并发程序设计.pdf
Java_network_programming是Java编程语言中一个基础组件,用于实现网络通信。以下是Java网络编程案例教程习题参考答案中涉及到的知识点: 1. Socket编程:Socket是Java网络编程中最基本的组件,用于实现网络通信。...
java并发编程艺术java并发编程艺术java并发编程艺术java并发编程艺术java并发编程艺术
Java后端开发,JUC并发编程Java后端开发,JUC并发编程Java后端开发,JUC并发编程Java后端开发,JUC并发编程Java后端开发,JUC并发编程Java后端开发,JUC并发编程Java后端开发,JUC并发编程Java后端开发,JUC并发编程...
java并发编程java并发编程java并发编程java并发编程java并发编程
自从java创建以来就已经支持并发的理念,如线程和锁。这篇指南主要是为帮助java多线程开发人员理解并发的核心概念以及如何应用这些理念。本文的主题是关于具有java语言风格的Thread、synchronized、volatile,以及...
Java高并发编程,构建并发编程知识体系,提升面试成功率,完整版17章视频教程下载。 本课程将结合大量图示及代码演示,带你掌握多线程并发编程(线程安全,线程调度,线程封闭,同步容器等)与高并发处理思路与手段...
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...
JAVA并发编程艺术 高清pdf : 1.并发变成的挑战 2. java并发机制的底层实现原理 3. java 内存模型 4. java并发编程基础 5.java中的锁。。。。。。。
java并发编程实战源码 附有本书所有源码,maven 导入 eclipse或idea
《Java并发编程的艺术》内容涵盖Java并发编程机制的底层实现原理、Java内存模型、Java并发编程基础、Java中的锁、并发容器和框架、原子类、并发工具类、线程池、Executor框架等主题,每个主题都做了深入的讲解,同时...
《Java并发编程实战》是一本深入探讨Java平台并发编程的权威指南,由Tim Peierls等人与Brian Goetz合著,旨在帮助Java开发者理解和掌握在多线程环境中编写高效、安全的代码。这本书由拥有丰富经验的JDK并发大师及...
Java 网络编程可以实现客户端/服务器端的通信、数据传输、网络资源共享等功能。 knowledge point 2: Socket 编程 Socket 编程是 Java 网络编程的核心技术之一。Socket 是一种网络通信机制,允许不同的应用程序...
JAVA并发编程实践中文版 英文版 原书源码 带书签 java_concurrency_in_practice.pdf 英文版还是不错的,但是中文版的译者典型的没有技术功底,介绍上说什么专家, 翻译的非常差劲,有些句子都不通顺,都不知道自己去...
java并发编程内部分享PPT
深入讲解java并发编程技术,多线程、锁以及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 5以及6在开发并发程序中取得了显著的进步,提高了Java虚拟机的性能以及并发类的可伸缩性,并加入了丰富的新并发构建块。在...
Java并发编程常识 Java并发编程常识 Java并发编程常识