`
raymond.chen
  • 浏览: 1436942 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Java5多线程范例

阅读更多

Java5增加了新的类库并发集java.util.concurrent,该类库为并发程序提供了丰富的API,多线程编程在Java 5中更加容易,灵活。

 

以下是一个范例的源码。

 

1、Server类源码

package com.jeyo.java5;

import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class Server {
	public static final int PORT = 19788;
	
	private ExecutorService pool = null;
	private ServerSocket serverSocket = null;
	
	public void start(){
		//创建一个可重用固定线程数的线程池
		pool = Executors.newFixedThreadPool(10);
		
		//创建一个可根据需要创建新线程的线程池
		//pool = Executors.newCachedThreadPool();
		
		try{
			serverSocket = new ServerSocket();
			serverSocket.setReuseAddress(true);
			serverSocket.bind(new InetSocketAddress(PORT));
			
			System.out.println("开始监听...");
			while(true){
				Socket socket = serverSocket.accept(); //获取客户端线程,没有则等待
				
				//异步执行
				//要是线程池繁忙,是等待还是终止?
				pool.execute(new ServiceThread(socket));
			}
		}catch(Exception e){
			e.printStackTrace();
		}
		
		cleanup();
	}
	
	public void cleanup() {
		if(serverSocket != null){
			try{
				serverSocket.close(); //关闭服务器线程
			}catch(IOException e){
				e.printStackTrace();
			}
		}
		
		pool.shutdown(); //关闭线程池
	}
	
	public static void main(String args[]) {
		Server server = new Server();
		server.start();
	}

}

 

2、ServiceThread类源码

package com.jeyo.java5;

import java.io.BufferedInputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.Serializable;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.locks.ReentrantLock;

public class ServiceThread implements Runnable, Serializable {
	private static final long serialVersionUID = 0;
	private Socket connectedSocket = null;
	private static int count = 0;
	private static ReentrantLock lock = new ReentrantLock(); //重入锁:是一种递归无阻塞的同步机制
	
	ServiceThread(Socket socket) {
		connectedSocket = socket;
	}
	
	public void run(){
		increaseCount();
		int curCount = getCount();
		
		String helloString = "最新序列号:" + curCount + "\n";
		
		//该对象只有一个线程可用来执行任务,若任务多于一个,任务将按先后顺序执行
		ExecutorService executor = Executors.newSingleThreadExecutor();
		
		Future<String> future = executor.submit(new OtherTask()); //异步执行其它逻辑代码
		
		DataOutputStream out = null;
		try{
			//往客户端线程输出信息
			out = new DataOutputStream(connectedSocket.getOutputStream());
			out.write(helloString.getBytes());
			
			//获取客户端传送过来的信息
			DataInputStream reader = new DataInputStream(new BufferedInputStream(connectedSocket.getInputStream()));
			System.out.println(reader.readUTF());
			
			try{
				out.write("其它任务的结果:\n".getBytes());
				String result = future.get(); //同步获取任务结果
				out.write(result.getBytes());
				
			}catch(Exception e){
				e.printStackTrace();
			}
			
		}catch(Exception e){
			e.printStackTrace();
		}finally{
			if(out != null){
				try{
					out.close(); //关闭输出流
				}catch(Exception e){
					e.printStackTrace();
				}
			}
			
			executor.shutdown(); //关闭线程执行器
		}
	}
	
	private int getCount() {
		int ret = 0;
		try{
			lock.lock();
			ret = count;
		}finally{
			lock.unlock(); //切记要在finally中释放锁
		}
		return ret;
	}
	
	private void increaseCount() {
		try{
			lock.lock();
			++count;
		}finally{
			lock.unlock();
		}
	}
	
}

 

3、OtherTask类源码

package com.jeyo.java5;

import java.util.concurrent.Callable;

public class OtherTask implements Callable<String> {
	public String call() throws Exception {
		return "执行了其它逻辑代码。";
	}
}

 

4、Client类源码

package com.jeyo.java5;

import java.io.BufferedInputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;

public class Client {
	private Socket client;
  
    public Client(String host, int port){   
        try{     
            client = new Socket(host, port);  
        }catch(IOException e){   
            System.out.println("服务器连接失败!");  
            close();   
        }
    }   
         
    public void send(){   
        DataOutputStream out = null;     
        try{
            //往服务器发送信息
            out = new DataOutputStream(client.getOutputStream());
            out.writeUTF("中国");
            out.flush(); 
              
            //获取服务器传送过来的信息
            DataInputStream reader = new DataInputStream(new BufferedInputStream(client.getInputStream()));
            
            int bufferSize = 2048; //2K   
            byte[] buf = new byte[bufferSize];   
               
            int read = 0;   
            while((read=reader.read(buf)) != -1){   
                System.out.println(new String(buf, 0, read));  
            } 
            
        }catch(IOException ex){   
            ex.printStackTrace();
        }finally{   
            try{    
                out.close();   
            }catch(IOException e){   
                e.printStackTrace();   
            }   
            
            close();    
        }   
    }   
       
    private void close(){   
        if(client != null){   
            try{   
                client.close();   
            }catch(IOException e){   
                e.printStackTrace();   
            }   
        }   
    }   
       
    public static void main(String[] args) {   
        Client client = new Client("localhost", Server.PORT);   
        client.send();    
    }   
    
}

  

分享到:
评论

相关推荐

    java 多线程交互简单范例

    这个压缩包中的文件提供了几个关于Java多线程交互的实例,可以帮助我们深入理解如何在并发环境中控制线程的同步,确保数据的一致性和安全性。 首先,让我们讨论一下标题和描述中提到的关键概念——“多线程交互”和...

    JAVAJAVA多线程教学演示系统论文

    总的来说,《JAVA多线程教学演示系统》这篇论文不仅是对JAVA多线程技术的理论探讨,更是一个实践与教学相结合的优秀范例,对于提升学生的多线程编程能力具有很高的参考价值。VB图书管理系统论文范文虽不在本文讨论...

    java多线程应用实现示例

    总结,这个"java多线程应用实现示例"通过小球运动的模拟,深入浅出地展示了Java多线程的运用,包括线程创建、同步、通信和线程池管理等关键概念。学习这个示例有助于理解和掌握Java多线程编程,为实际项目开发中的...

    大漠多线程范例源码

    【大漠多线程范例源码】是一个关于多线程编程的实例集合,由知名IT专家"大漠"提供,旨在帮助开发者深入理解和实践Java或其他编程语言中的多线程技术。多线程是现代软件开发中不可或缺的一部分,特别是在并发处理、高...

    java多线程设计模式详解(PDF及源码)

    (注意,本资源附带书中源代码可供参考) 多线程与并发处理是程序设计好坏优劣的重要课题,本书通过浅显易懂的文字与实例来介绍Java线程相关的设计模式概念,并且通过实际的Java程序范例和 UML图示来一一解说,书中...

    Java多线程下载器范例

    综上所述,"Java多线程下载器范例"涉及了Java多线程编程、文件I/O操作、线程同步和通信、下载策略等多个核心概念。通过理解和实践这些知识点,开发者可以构建出高效、稳定的文件下载工具。在实际项目中,这样的下载...

    (Java)FTP多线程下载源代码

    采用apache commons开发包,实现了FTP多线程下载,并有简单的包括进度条的界面,代码的运行:1 把自己的PC配置成FTP服务器(只需下载Serc-U软件)2 建立用户,用户名:zhangyu,密码:123,设置根目录,并拷贝进一些...

    java多线程编程源码范例和详细说明(由浅入深,深度解读在资料后半部分).docx

    Java 多线程编程源码范例和详细说明 Java 多线程编程是一种能够同时执行多个任务的技术,可以提高程序的并发性和响应性,使得程序能够更好地利用 CPU 资源。本文将通过一个简单的 Java 多线程编程示例,向读者介绍...

    java多线程设计模式及源码

    多线程与并发处理是程序设计好坏优劣的重要课题,本书通过浅显易懂的文字与实例来介绍JAVA线程相关的设计模式概念,并且通过实际的JAVA程序范例和UML图示来一一解说,书中有代码的重要部分加上标注使读者更加容易...

    JAVA多线程设计模式_中国铁道出版社_源码

    JAVA多线程设计模式_中国铁道出版社 本书浅显易懂的介绍了JAVA线程相关的设计模式,通过程序范例和UML图示来一一解说,书中代码的重要部分加了标注以使读者更加容易理解,再加上图文并茂,对于初学者还是程序设计...

    JAVA编程通用范例

    4. **多线程**:Java提供了内置的多线程支持,如Thread类和Runnable接口。通用范例可能会包含线程同步、锁机制(如synchronized关键字、ReentrantLock等)、并发工具类(如ExecutorService、CountDownLatch、...

    JAVA多线程设计模式

    本书适合那些希望在Java多线程领域有所建树的读者,它不仅提供了理论知识,更提供了大量的实践机会,通过范例和习题相结合的方式,帮助读者快速掌握多线程设计模式。同时,本书也适合那些在实际项目开发中需要处理...

    [JAVA编程模式与范例].zip

    - 使用Java实现网络聊天室,应用多线程和网络编程知识。 通过这个压缩包中的范例,你可以深入学习和实践这些Java编程模式,增强对Java语言和设计原则的理解,提升编程能力。同时,理论与实践相结合,不断调试和...

    java开发范例大全

    6. **多线程**:Java支持并发编程,范例可能包含线程的创建、同步、线程池的使用等。理解如何在多线程环境下协调任务执行,是构建高性能应用程序的关键。 7. **反射机制**:Java的反射机制允许在运行时动态访问类的...

    Java范例大全 源码

    这是一本关于Java开发的大百科全书,以知识点为脉络,以实例(200多个实例贯穿全书)为主要内容,深入阐述了Java开发的各种方法和技巧,权威性毋庸置疑。首先,全书以Java开发环境搭建开篇,循序渐进地介绍了Java语法...

    java通过线程控制程序执行超时(新)

    在Java编程中,控制程序执行超时是一项重要的任务,特别是在多线程环境下,我们可能需要确保某个任务不会无限制地运行下去,导致资源耗尽。本文将深入探讨如何使用Java的线程机制来实现程序执行的超时控制,同时也会...

    Java通用范例开发金典

    6. **多线程**:Java内置了对多线程的支持,包括Thread类和Runnable接口,以及synchronized关键字、wait()、notify()等同步机制。理解并发编程原理,能有效提升程序的并行性能。 7. **网络编程**:Java提供了Socket...

    《Java多线程设计模式》附源码中文教程 (PDF)

    多线程与并发处理是程序设计好坏优劣的重要课题,本书通过浅显易懂的文字与实例来介绍Java线程相关的设计模式概念,并且通过实际的Java程序范例和 UML图示来一一解说,书中在代码的重要部分加上标注使读者更加容易...

    Java范例开发大全

    《Java范例开发大全》共22章,内容涉及Java开发环境的搭建、Java基础类型与运算符、条件控制语句、异常处理、数组、字符串、输入输出流、面向对象及其四大特征、内部类与接口、Java常用类、集合、多线程编程、Java...

    Java通用范例 开发金典

    本资源包含了前十章的部分代码,这意味着我们能够接触到Java的基础语法、面向对象编程、异常处理、集合框架、IO流、多线程等核心主题。 1. **基础语法**:这部分可能包含变量声明、数据类型、运算符、流程控制(如...

Global site tag (gtag.js) - Google Analytics