Java1.6多线程之同步方法

简介: <pre name="code" class="java">package com.starit.open.main;import java.util.ArrayList;import java.util.List;import java.util.concurrent.Callable;import java.util.concurrent.ExecutionException
package com.starit.open.main;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

/**
 * 
 * @author wenin819
 * 
 *         Callable 和 Future接口
 *         Callable是类似于Runnable的接口,实现Callable接口的类和实现Runnable的类都是可被其它线程执行的任务。
 *         Callable和Runnable有几点不同: 
 *         (1)Callable规定的方法是call(),而Runnable规定的方法是run().
 *         (2)Callable的任务执行后可返回值,而Runnable的任务是不能返回值的。
 *         (3)call()方法可抛出异常,而run()方法是不能抛出异常的。 
 *         (4)运行Callable任务可拿到一个Future对象,
 *         Future 表示异步计算的结果。它提供了检查计算是否完成的方法,以等待计算的完成,并检索计算的结果。
 *         通过Future对象可了解任务执行情况,可取消任务的执行,还可获取任务执行的结果。
 * 
 */
public class CallableThreadSync implements Runnable{
	
	private static final ExecutorService es = Executors.newFixedThreadPool(5);
	
	public static class ItemThread implements Callable<Integer> {
		public int addNum;
		public ItemThread(int addNum) {
			this.addNum = addNum;
		}
		
		@Override
		public Integer call() {
			try {
				Thread.sleep(addNum * 1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			return addNum * 2;
		}
	}
	
	public static void main(String[] args) {
		CallableThreadSync test = new CallableThreadSync();
		long startTime = System.currentTimeMillis();
		new Thread(test, "thread1").start();
		new Thread(test, "thread2").start();
		long endTime = System.currentTimeMillis();
		System.out.println("main:用时" + (endTime - startTime) / 1000 + "秒");
	}

	public void run() {
		long startTime = System.currentTimeMillis();
		List<ItemThread> itemThreads = new ArrayList<CallableThreadSync.ItemThread>(3);
		ItemThread itemThread = null;
		for(int i = 0; i < 3; i++) {
			itemThread = new ItemThread(i + 1);
			itemThreads.add(itemThread);
		}
		List<Future<Integer>> futureList = null;
		try {
			futureList = es.invokeAll(itemThreads);
		} catch (InterruptedException e1) {
			e1.printStackTrace();
		}
		Integer result = 1;
		for(Future<Integer> future : futureList) {
				try {
					result += future.get();
				} catch (InterruptedException e) {
					e.printStackTrace();
				} catch (ExecutionException e) {
					e.printStackTrace();
				}
		}
		String infoMsg = Thread.currentThread().getName() + ":";
		long endTime = System.currentTimeMillis();
		System.out.println(infoMsg + result + "(用时" + (endTime - startTime) / 1000 + "秒)");
	}
	
	@Override
	protected void finalize() throws Throwable {
		es.shutdownNow();
		super.finalize();
	}

}


相关文章
|
6天前
|
存储 Java 数据库连接
java多线程之线程通信
java多线程之线程通信
|
7天前
|
安全 Java 开发者
深入理解Java并发编程:线程安全与性能优化
【4月更文挑战第9天】本文将深入探讨Java并发编程的核心概念,包括线程安全和性能优化。我们将详细解析Java中的同步机制,包括synchronized关键字、Lock接口以及并发集合等,并探讨它们如何影响程序的性能。此外,我们还将讨论Java内存模型,以及它如何影响并发程序的行为。最后,我们将提供一些实用的并发编程技巧和最佳实践,帮助开发者编写出既线程安全又高效的Java程序。
20 3
|
8天前
|
Java
Java 并发编程:深入理解线程池
【4月更文挑战第8天】本文将深入探讨 Java 中的线程池技术,包括其工作原理、优势以及如何使用。线程池是 Java 并发编程的重要工具,它可以有效地管理和控制线程的执行,提高系统性能。通过本文的学习,读者将对线程池有更深入的理解,并能在实际开发中灵活运用。
|
6天前
|
算法 Java 开发者
Java中的多线程编程:概念、实现与性能优化
【4月更文挑战第9天】在Java编程中,多线程是一种强大的工具,它允许开发者创建并发执行的程序,提高系统的响应性和吞吐量。本文将深入探讨Java多线程的核心概念,包括线程的生命周期、线程同步机制以及线程池的使用。接着,我们将展示如何通过继承Thread类和实现Runnable接口来创建线程,并讨论各自的优缺点。此外,文章还将介绍高级主题,如死锁的预防、避免和检测,以及如何使用并发集合和原子变量来提高多线程程序的性能和安全性。最后,我们将提供一些实用的性能优化技巧,帮助开发者编写出更高效、更稳定的多线程应用程序。
|
5天前
|
Java
Java中ReentrantLock中tryLock()方法加锁分析
Java中ReentrantLock中tryLock()方法加锁分析
8 0
|
4天前
|
安全 算法 Java
深入理解Java并发编程:线程安全与性能优化
【4月更文挑战第11天】 在Java中,高效的并发编程是提升应用性能和响应能力的关键。本文将探讨Java并发的核心概念,包括线程安全、锁机制、线程池以及并发集合等,同时提供实用的编程技巧和最佳实践,帮助开发者在保证线程安全的前提下,优化程序性能。我们将通过分析常见的并发问题,如竞态条件、死锁,以及如何利用现代Java并发工具来避免这些问题,从而构建更加健壮和高效的多线程应用程序。
|
16小时前
|
设计模式 运维 安全
深入理解Java并发编程:线程安全与性能优化
【4月更文挑战第15天】在Java开发中,多线程编程是提升应用程序性能和响应能力的关键手段。然而,它伴随着诸多挑战,尤其是在保证线程安全的同时如何避免性能瓶颈。本文将探讨Java并发编程的核心概念,包括同步机制、锁优化、线程池使用以及并发集合等,旨在为开发者提供实用的线程安全策略和性能优化技巧。通过实例分析和最佳实践的分享,我们的目标是帮助读者构建既高效又可靠的多线程应用。
|
2天前
|
Java 程序员 编译器
Java中的线程同步与锁优化策略
【4月更文挑战第14天】在多线程编程中,线程同步是确保数据一致性和程序正确性的关键。Java提供了多种机制来实现线程同步,其中最常用的是synchronized关键字和Lock接口。本文将深入探讨Java中的线程同步问题,并分析如何通过锁优化策略提高程序性能。我们将首先介绍线程同步的基本概念,然后详细讨论synchronized和Lock的使用及优缺点,最后探讨一些锁优化技巧,如锁粗化、锁消除和读写锁等。
|
3天前
|
Java
探秘jstack:解决Java应用线程问题的利器
探秘jstack:解决Java应用线程问题的利器
13 1
探秘jstack:解决Java应用线程问题的利器
|
3天前
|
Java 调度 开发者
Java 21时代的标志:虚拟线程带来的并发编程新境界
Java 21时代的标志:虚拟线程带来的并发编程新境界
14 0