`
jiuyuehe
  • 浏览: 184182 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

边读边写【7】 ----java 多线程实战【Thread /Executors】

阅读更多
前面2个月一直忙碌,但是还是不忘在iteye 上发发帖子,写写文章。终于这周over了2套系统,剩下的时间基本上修改跟维护了。
在完成的一套“应用安装系统”后对多线程的理解又深了一点。
这里写出来,一来跟大家分享,二来让坛子里的大牛们指教指教,许多不足之处。
ps:看《maven 实战》看着看着就想睡觉,不知为什么?我一般看书很认真的。

ok。看看需求:

首先来实现一个多线程。简单的说就是在一个方法里头要完成6件事,6件事没有直接关联关系。不会因为一件事不完成导致下面的事情无法完成。都完成好了,就执行下一个方法。


线程的俩种实现方式,如果你的代码已经继承其他类了,就实现Runnable借口。这俩种方式的线程都是没有返回值的。

公司的代码不好贴,这里贴个变相的demo.

策略一:
public class TestThread {
	//
	private static int i;
	//这里就相当做事的方法,所以线程都做这一件事,同时做
	public void get(long name) {
		try {
			Thread.sleep(name);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		System.out.println("-----name-----"+name);
		i++;
	}
	//全部做完了。
	public int  over(int n){
		System.out.println("---over--"+n);
		return n;
	}
	
	//正开始做
	public void  ing (){
		final TestThread td = new TestThread();
		
		Thread tr4  = new Thread(new Runnable(){
			@Override
			public void run() {
				td.get(1500L);
			}
		});
		tr4.start();
		
		new Thread(){
			public void run (){
				td.get(500L);
			}
		}.start();
		
		
		new Thread(){
			public void run (){
				td.get(100L);
			}
		}.start();
	}
	
	public void show(){
		System.out.println("=======show()========");
	}
	

	public static void main(String[] args) {
                //调用
		final TestThread ted = new TestThread();
		ted.ing();
		//来一个守护线程,监视看是不是所以的事情都做完了。做完了守护线程也跟着挂了
		Thread tt = new Thread(){
		public void run (){
			while(true){
				try {    //守护线程每100ms检查一下各个线程的完成状况
					Thread.sleep(100);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
                                     //方法运行了3此,代码多做了,这是守护线程也要挂了,挂之前。。。。。
				if(i==3){
					ted.show();
					ted.over(1);
				}
				
			}
		}		
		};
		tt.setDaemon(true);
		tt.start();
		
		//ted.show();	  这个方法会同是运行
		
	}
}


这样做貌似也能达到要求。但是有明显的缺点。
第一:线程同时运行,必须用守护线程去执行线程做完以后将要运行的方法:这是不可取的,守护线程会立刻跟这死掉,如果将要做的事情的需要消耗大量的时间,或者开销的话,那么这个方法是不会正确执行的。【不知道具体原因,希望大鸟能指点迷津。】
第二:程序一执行,各个线程独立跑,守护线程只能监视各个线程的状态而无法获取各个线程所执行的事情是否成功了。这是相当不理想的。

策略二:Callable
public class HasValueThread {
	public void a(){
		Callable ca1 = 	new Callable(){
			@Override
			public Object call() throws Exception {
				System.out.println("==yes===");
				return true;
			}
			
		};
		
		Date d1 = new Date();
		System.out.println("d1"+d1.toLocaleString());
		 //ExecutorService exec = Executors.newCachedThreadPool();//创建线程池 
		 ExecutorService exec = Executors.newFixedThreadPool(7);//创建线程池 
		  Callable c1 = new MyCallable("A",1000); 
          Callable c2 = new MyCallable("B",5000); 
          Callable c3 = new MyCallable("c",15000); 
         Future f1 =  exec.submit(c1);
         Future f2 =  exec.submit(c2);
         Future f4 =  exec.submit(c3);
         Future f3 =  exec.submit(ca1);
         
         try {
        	 
			System.out.println(f1.get().toString()+System.currentTimeMillis());
			System.out.println(f2.get().toString()+System.currentTimeMillis());
			System.out.println(f4.get().toString()+System.currentTimeMillis());
			System.out.println(f3.get().toString()+System.currentTimeMillis());
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ExecutionException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
         exec.shutdown();
	}
	
	public static void main(String[] args) {
		new HasValueThread().a();
		
		System.out.println("------");
	}

}
class MyCallable implements Callable{ 
    private String oid; 
    private long n;
    MyCallable(String oid,long n) { 
            this.oid = oid; 
            this.n = n;
    } 

    @Override 
    public Object call() throws Exception { 
    	Date d2 = new Date();
		System.out.println("d2"+d2.toLocaleString());
    		Thread.sleep(n);
            return oid+"任务返回的内容"; 
    } 
} 


使用策略二的好处有:
第一:Callable 的好处是有返回值,也就是说一个线程是否成功完成了他的使命,我们可以从他的返回的结果中【自定义结果】中得知。
第二:ThreadPoolExecutor【写了一些并发包相关的博文放在草稿箱里没有发表出来,主要是怕错误太多 - -,贻笑大方】它提供了一个线程池,使用方法通常使用 Executors 工厂方法配置。 api说:线程池可以解决两个不同问题:由于减少了每个任务调用的开销,它们通常可以在执行大量异步任务时提供增强的性能,并且还可以提供绑定和管理资源(包括执行任务集时使用的线程)的方法。每个 ThreadPoolExecutor 还维护着一些基本的统计数据,如完成的任务数。用Executor提交一个带返回值的Callable到ExecutorService里面。返回只类型是Futrue[未来,很有意思]。更有意思的是他会等全部的Callable执行完了以后在往下走,当然需要控制的是:
 //ExecutorService exec = Executors.newCachedThreadPool();//创建线程池 
		 ExecutorService exec = Executors.newFixedThreadPool(7);//创建线程池 

第一个newCachedThreadPool();他会启动n个线程来完成你的任务。他能自动线程回收。但是他的时间是60s.可以把这个demo跑下,发现让他sleep70秒他可以。这个问题我搞了很久没搞明白【求明白的分享】。所以我没用。用的是.newFixedThreadPool(7)参数能设置他的线程数。

总的来说还是那俩句话,一是分享,一是请教。谢谢


分享到:
评论

相关推荐

    java多线程的讲解和实战

    本资料详细讲解了Java多线程的原理,并提供了丰富的实战代码,非常适合Java初学者以及希望深入理解多线程的开发者。 1. **线程的基本概念**:线程是程序执行的最小单位,一个进程中可以有多个线程同时运行。Java...

    java 多线程编程实战指南(核心 + 设计模式 完整版)

    《Java多线程编程实战指南》这本书深入浅出地讲解了Java多线程的核心概念和实战技巧,分为核心篇和设计模式篇,旨在帮助开发者掌握并应用多线程技术。 1. **线程基础** - **线程的创建**:Java提供了两种创建线程...

    JAVA多线程模式高清版+DEMO

    这个压缩包文件"JAVA多线程模式高清版+DEMO"显然是关于Java多线程设计模式的详细教程,很可能包含了理论讲解、代码示例以及实战DEMO。 在Java多线程编程中,了解和掌握以下知识点至关重要: 1. **线程的创建与启动...

    简单直观-实战体会Java多线程编程的精要(转)

    本文将基于给定的标题“简单直观-实战体会Java多线程编程的精要”来详细阐述Java多线程的核心概念、实现方式以及实战中的关键点。 一、Java多线程基础 1. **线程定义**:线程是程序执行的最小单位,一个进程中可以...

    Java多线程文章系列.pdf

    #### 十一、实战Java多线程编程精要之高级支持 - **线程组**: - 用于管理和控制一组线程。 - **线程间发信**: - 实现线程间的通信。 - **屏蔽同步**: - 采用特定技术减少同步的使用。 - **守护线程**: - 守护...

    java多线程相关资料整理

    Java多线程是Java开发中的重要组成部分,它允许程序同时执行多个任务,提高..."Java多线程源码笔记.pdf"这样的文档通常会涵盖以上内容,并可能包含具体的源码分析和实战案例,对于理解和掌握Java多线程编程非常有帮助。

    Java-Java线程编程教程

    本教程将深入探讨Java多线程的相关概念、原理及实战技巧。 首先,我们需要理解什么是线程。线程是程序执行的基本单元,一个进程中可以包含多个线程,每个线程都拥有独立的程序计数器、系统栈以及局部变量。多线程...

    Java多线程知识,龙果学院

    "Java多线程知识,龙果学院"这一课程显然是针对这部分内容进行深入讲解的资源,旨在帮助开发者提升在多任务环境下的编程能力。 一、Java多线程基础 1. **线程的概念**:线程是程序执行的最小单元,一个进程可以有...

    Java多线程programmingShiZhanZhiNan(呵心篇).源码

    Java多线程编程实战指南(呵心篇)是一份深入探讨Java并发编程的资源,它提供了丰富的源码示例来帮助开发者理解并掌握多线程技术。在这个领域,Java提供了强大的支持,使得开发者能够构建高性能、高并发的应用程序。...

    java多线程并发编程 核心技术应用实践

    在《java多线程并发编程核心技术应用实践》中,我们将深入探讨Java平台上的并发机制、线程安全与同步控制、线程池以及实战技巧。 首先,我们需要理解Java中的线程基础。线程是程序执行的最小单位,一个进程可以有多...

    (PDF带目录)《Java 并发编程实战》,java并发实战,并发

    《Java 并发编程实战》是一本专注于Java并发编程的权威指南,对于任何希望深入了解Java多线程和并发控制机制的开发者来说,都是不可或缺的参考资料。这本书深入浅出地介绍了如何在Java环境中有效地管理和控制并发...

    《Java并发编程实战》PDF版本下载.txt

    在Java中,通过多线程机制实现并发处理,使得程序能够更高效地利用计算机资源。 #### 2. Java中的线程生命周期 Java线程有以下几种状态: - **新建状态**(New):创建后尚未启动。 - **就绪状态**(Runnable):...

    Java线程(第三版)

    《Java线程(第三版)》是一本深入探讨Java线程技术的专业书籍,旨在帮助开发者理解和掌握Java平台上的多线程编程。Java线程是并发编程的重要组成部分,它允许程序同时执行多个任务,从而充分利用系统资源,提高程序的...

    1.Java分布式与微服务实战\多线程与分布式\第1节 线程池

    Java分布式与微服务实战\多线程与分布式\第1节 线程池 线程池是Java中的一种重要的多线程机制,用于管理和控制线程的创建、运行和销毁。线程池的出现可以解决多线程带来的问题,例如反复创建和销毁线程所带来的开销...

    java面试多线程高并发相关回家技巧(超经典)

    在Java编程领域,多线程和高并发是面试中经常被问到的重要知识点,也是大型系统设计的关键技术。本文将围绕“Java面试多线程高并发相关回家技巧”这一主题,深入探讨相关概念、原理以及面试中可能遇到的问题,帮助你...

    JAVA并发编程与高并发解决方案 JAVA高并发项目实战课程

    `ExecutorService`是Java提供的高级线程池接口,它可以控制线程的数量,重用线程,以及管理线程的生命周期。 - **示例代码**: ```java ExecutorService executor = Executors.newFixedThreadPool(5); // 创建固定...

    67.多线程代码.zip

    Java多线程是Java编程中的一个重要概念,它允许程序同时执行多个任务,从而提高系统效率...在IdeaProjects这样的学习资源中,通常会包含相关的代码示例、实战项目和讲解文档,帮助开发者深入理解和掌握Java多线程技术。

    《Java 并发编程实战》.zip

    《Java 并发编程实战》是一本专注于Java并发编程领域的权威书籍,旨在帮助开发者深入理解和掌握在多线程环境中编写高效、安全且可维护的代码。这本书涵盖了Java并发编程的基础概念,高级特性以及最佳实践,是Java...

    Java高并发经典文档-MOBI-可在电子书里查看

    - **CyclicBarrier**:多线程同步点,允许一组线程等待其他线程到达屏障点。 - **Semaphore**:信号量,用于控制同时访问特定资源的线程数量。 7. **Java内存模型与 volatile** - **Java内存模型(JMM)**:理解...

Global site tag (gtag.js) - Google Analytics