Java精彩编程200例 PDF 超清版

  • 更新时间:
  • 1833人关注
  • 点击下载

Java精彩编程200例》是一本关于Java编程相关的电子书资源,介绍了关于Java编程、Java编程实例方面的内容,本书是由吉林大学出版社出版,格式为PDF,资源大小79 MB,明日科技(Mingri Soft)编写,目前豆瓣、亚马逊、当当、京东等综合评分为:9.1分,一起来看下具体内容。

资源详情相关推荐
《Java精彩编程200例》封面
  • 出版社:吉林大学出版社
  • 作者:明日科技(Mingri、Soft)
  • 大小:79 MB
  • 类别:Java编程
  • 热度:816
  • JavaScript编程全解
  • JavaScript函数式编程指南
  • Java线程与并发编程实践
  • Java编程实战宝典
  • JavaScript函数式编程
  • 《Java精彩编程200例》汇集了与Java桌面程序开发相关的200个实例及源代码,每个实例都按实例说明、关键技术、实现过程、扩展学习的顺序进行分析解读。全书主要内容有Java基础应用、图形与图表操作、文字操作与数据库、网络安全与多线程、Swing程序设计。每个实例都是经过一线工程师精心编选的,具有很强的实用性,这些实例为开发人员提供了全面的解决方案。配书光盘附赠了实例的完整源程序及部分讲解视频。《Java精彩编程200例》既适合Java程序员参考,也适合高校学生、软件开发培训学员及相关求职人员学习。

    作者简介

    明日科技,是一家专业从事软件开发、教育培训以及软件开发教育资源整合的高科技公司,其编写的教材既注重选取软件开发中的必需、常用内容,又注重内容的易学、方便以及相关知识的拓展,深受读者喜爱。其编写的图书主要有“从入门到精通”“软件开发视频大讲堂”“软件开发实战1221例”“软件工程师开发大系”等多个系列。多次荣获“全行业优秀畅销品种”“中国大学出版社优秀畅销书”

    目录

    展开阅读
    精选笔记1:java多线程编程同步器Future和FutureTask解析及代码示例

    16小时27分钟前回答

    publicinterfaceFuture<V>Future表示异步计算的结果。它提供了检查计算是否完成的方法,以等待计算的完成,并获取计算的结果。计算完成后只能使用get方法来获取结果,如有必要,计算完成前可以阻塞此方法。取消则由cancel方法来执行。还提供了其他方法,以确定任务是正常完成还是被取消了。一旦计算完成,就不能再取消计算。如果为了可取消性而使用Future但又不提供可用的结果,则可以声明Future<?>形式类型、并返回null作为底层任务的结果。

    Future主要定义了5个方法:

    1)booleancancel(booleanmayInterruptIfRunning):试图取消对此任务的执行。如果任务已完成、或已取消,或者由于某些其他原因而无法取消,则此尝试将失败。当调用cancel时,如果调用成功,而此任务尚未启动,则此任务将永不运行。如果任务已经启动,则mayInterruptIfRunning参数确定是否应该以试图停止任务的方式来中断执行此任务的线程。此方法返回后,对isDone()的后续调用将始终返回true。如果此方法返回true,则对isCancelled()的后续调用将始终返回true。

    2)booleanisCancelled():如果在任务正常完成前将其取消,则返回true。

    3)booleanisDone():如果任务已完成,则返回true。可能由于正常终止、异常或取消而完成,在所有这些情况中,此方法都将返回true。

    4)Vget()throwsInterruptedException,ExecutionException:如有必要,等待计算完成,然后获取其结果。

    5)Vget(longtimeout,TimeUnitunit)throwsInterruptedException,ExecutionException,TimeoutException:如有必要,最多等待为使计算完成所给定的时间之后,获取其结果(如果结果可用)。

    Future<V>接口

    Future<V>接口是用来获取异步计算结果的,说白了就是对具体的Runnable或者Callable对象任务执行的结果进行获取(get()),取消(cancel()),判断是否完成等操作。我们看看Future接口的源码:

    public interface Future<V> { 
     boolean cancel(boolean mayInterruptIfRunning); 
     boolean isCancelled(); 
     boolean isDone(); 
     V get() throws InterruptedException, ExecutionException; 
     V get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException; 
    } 

    方法解析:

    Vget():获取异步执行的结果,如果没有结果可用,此方法会阻塞直到异步计算完成。

    Vget(Longtimeout,TimeUnitunit):获取异步执行结果,如果没有结果可用,此方法会阻塞,但是会有时间限制,如果阻塞时间超过设定的timeout时间,该方法将抛出异常。

    booleanisDone():如果任务执行结束,无论是正常结束或是中途取消还是发生异常,都返回true。

    booleanisCanceller():如果任务完成前被取消,则返回true。

    booleancancel(booleanmayInterruptRunning):如果任务还没开始,执行cancel(...)方法将返回false;如果任务已经启动,执行cancel(true)方法将以中断执行此任务线程的方式来试图停止任务,如果停止成功,返回true;当任务已经启动,执行cancel(false)方法将不会对正在执行的任务线程产生影响(让线程正常执行到完成),此时返回false;当任务已经完成,执行cancel(...)方法将返回false。mayInterruptRunning参数表示是否中断执行中的线程。

    通过方法分析我们也知道实际上Future提供了3种功能:(1)能够中断执行中的任务(2)判断任务是否执行完成(3)获取任务执行完成后额结果。

    但是我们必须明白Future只是一个接口,我们无法直接创建对象,因此就需要其实现类FutureTask登场啦。

    FutureTask类

    FutureTask可用于异步获取执行结果或取消执行任务的场景。通过传入Runnable或者Callable的任务给FutureTask,直接调用其run方法或者放入线程池执行,之后可以在外部通过FutureTask的get方法异步获取执行结果,因此,FutureTask非常适合用于耗时的计算,主线程可以在完成自己的任务后,再去获取结果。另外,FutureTask还可以确保即使调用了多次run方法,它都只会执行一次Runnable或者Callable任务,或者通过cancel取消FutureTask的执行等。

    我们来看看FutureTask的实现

    public class FutureTask<V> implements RunnableFuture<V> { 

    FutureTask类实现了RunnableFuture接口,我们看一下RunnableFuture接口的实现:

    public interface RunnableFuture<V> extends Runnable, Future<V> { 
     void run(); 
    } 

    分析:FutureTask除了实现了Future接口外还实现了Runnable接口,因此FutureTask也可以直接提交给Executor执行。当然也可以调用线程直接执行(FutureTask.run())。接下来我们根据FutureTask.run()的执行时机来分析其所处的3种状态:

    (1)未启动,FutureTask.run()方法还没有被执行之前,FutureTask处于未启动状态,当创建一个FutureTask,而且没有执行FutureTask.run()方法前,这个FutureTask也处于未启动状态。

    (2)已启动,FutureTask.run()被执行的过程中,FutureTask处于已启动状态。

    (3)已完成,FutureTask.run()方法执行完正常结束,或者被取消或者抛出异常而结束,FutureTask都处于完成状态。

    FutureTask类是Future的一个实现,并实现了Runnable,所以可通过Excutor(线程池)来执行。也可传递给Thread对象执行。如果在主线程中需要执行比较耗时的操作时,但又不想阻塞主线程时,可以把这些作业交给Future对象在后台完成,当主线程将来需要时,就可以通过Future对象获得后台作业的计算结果或者执行状态。下面的例子模拟一个会计算账的过程,主线程已经获得其他帐户的总额了,为了不让主线程等待PrivateAccount类的计算结果的返回而启用新的线程去处理,并使用FutureTask对象来监控,这样,主线程还可以继续做其他事情,最后需要计算总额的时候再尝试去获得privateAccount的信息。

    package test;
    import java.util.Random;
    import java.util.concurrent.Callable;
    import java.util.concurrent.ExecutionException;
    import java.util.concurrent.FutureTask;
    /**
     *
     * @author Administrator
     *
     */
    @SuppressWarnings("all")
    public class FutureTaskDemo {
    	public static void main(String[] args) {
    		// 初始化一个Callable对象和FutureTask对象
    		Callable pAccount = new PrivateAccount();
    		FutureTask futureTask = new FutureTask(pAccount);
    		// 使用futureTask创建一个线程
    		Thread pAccountThread = new Thread(futureTask);
    		System.out.println("futureTask线程现在开始启动,启动时间为:" + System.nanoTime());
    		pAccountThread.start();
    		System.out.println("主线程开始执行其他任务");
    		// 从其他账户获取总金额
    		int totalMoney = new Random().nextint(100000);
    		System.out.println("现在你在其他账户中的总金额为" + totalMoney);
    		System.out.println("等待私有账户总金额统计完毕...");
    		// 测试后台的计算线程是否完成,如果未完成则等待
    		while (!futureTask.isDone()) {
    			try {
    				Thread.sleep(500);
    				System.out.println("私有账户计算未完成继续等待...");
    			}
    			catch (InterruptedException e) {
    				e.printStackTrace();
    			}
    		}
    		System.out.println("futureTask线程计算完毕,此时时间为" + System.nanoTime());
    		Integer privateAccountMoney = null;
    		try {
    			privateAccountMoney = (Integer) futureTask.get();
    		}
    		catch (InterruptedException e) {
    			e.printStackTrace();
    		}
    		catch (ExecutionException e) {
    			e.printStackTrace();
    		}
    		System.out.println("您现在的总金额为:" + totalMoney + privateAccountMoney.intValue());
    	}
    }
    @SuppressWarnings("all")
    class PrivateAccount implements Callable {
    	Integer totalMoney;
    	@Override
    		public Object call() throws Exception {
    		Thread.sleep(5000);
    		totalMoney = new Integer(new Random().nextint(10000));
    		System.out.println("您当前有" + totalMoney + "在您的私有账户中");
    		return totalMoney;
    	}
    }

    运行结果 

    futureTask线程现在开始启动,启动时间为:3098040622063 
    主线程开始执行其他任务 
    现在你在其他账户中的总金额为56983 
    等待私有账户总金额统计完毕... 
    私有账户计算未完成继续等待... 
    私有账户计算未完成继续等待... 
    私有账户计算未完成继续等待... 
    私有账户计算未完成继续等待... 
    私有账户计算未完成继续等待... 
    私有账户计算未完成继续等待... 
    私有账户计算未完成继续等待... 
    私有账户计算未完成继续等待... 
    私有账户计算未完成继续等待... 
    您当前有3345在您的私有账户中 
    私有账户计算未完成继续等待... 
    futureTask线程计算完毕,此时时间为3103072404138 
    您现在的总金额为:569833345

    总结

    以上就是本文关于java多线程编程同步器Future和FutureTask解析及代码示例的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站:

    Java多线程之显示锁和内置锁总结详解

    Java多线程中断机制三种方法及示例

    java多线程编程实例

    如有不足之处,欢迎留言指出。

    展开阅读

    Java编程相关资源

    • Java8编程入门官方教程

      Java8编程入门官方教程

      Java8编程入门官方教程(第6版) 针对新版JavaSE8对内容进行了全面更新。在畅销书作者Herbert Schildt(施密特)的帮助下,可以即刻开始学习Java程序设计的基础知识。《Java 8编程入门官方教程(第6版)

      大小:233 MBJava8

      立即下载
    • Java编程的逻辑

      Java编程的逻辑

      《Java编程的逻辑》作者马俊昌,从基本概念到高层框架,剖析实现原理与JDK源代码,融合专业理论与应用实践,透彻理解Java编程的思维逻辑。

      大小:39.3MJava编程

      立即下载
    • 神经网络编程实战:Java语言实现

      神经网络编程实战:Java语言实现

      大小:51.2 MB神经网络

      立即下载
    • JXTA-Java P2P网络编程技术

      JXTA-Java P2P网络编程技术

      JXTA是美国Sun公司在Java领域里推出的新技术,目的是为P2P(Peer-to-Peer)的网络应用开发提供一个统一的平台。而且为了鼓励和支持该技术的发展,JXTA项目采用了开放源代码的方式进行,吸引了

      大小:5.84 MBJava

      立即下载
    • Java高并发编程详解:多线程与架构设计

      Java高并发编程详解:多线程与架构设计

      《Java高并发编程详解》立足于线程源码剖析,从基础入手,逐层渐进深入,环环紧扣,针对技术细节进行了细致归纳,在解读源码的时候又引入了优秀的架构设计。

      大小:120.77 MBJava

      立即下载

    学习笔记

    9小时34分钟前回答

    Java编程WeakHashMap实例解析

    简述: 《Thinking in Java》第4版 P519 页 WeakHashMap一章读书笔记 WeakHashMap 用来保存WeakReference,这一结构云逊垃圾回收器自动清理键和值 在添加键和值的操作时,映射会自动使用WeakReference包装它们, 见jdk源代码, public V put(K key, V value) {Object k = maskNull(key);int h = hash(k);EntryK,V[] tab = getTable();int i = indexFor(h, tab.length);for (EntryK,V e = tab[i]; e != null; e = e.next) {if (h == e.hash eq(k, e.get())) {V oldValue = e.value;if (value != oldValue) e.value = value;return oldValue;}}modCount++;EntryK,V e = tab[i];tab[i] = new Entry(k, value, queue, h, e);if (++size = threshold) resize(tab.length * 2);return null;} 其中 new Entry(k, value, queue, h, e) 一行使用了 ReferenceQueue /** * Reference queue for c……

    10小时58分钟前回答

    Java编程用两个栈实现队列代码分享

    题目:用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。 经典题,不多说,直接上代码 import java.util.Stack;public class Solution { StackInteger stack1 = new StackInteger(); StackInteger stack2 = new StackInteger(); public void push(int node) { stack1.push(node); } public int pop() { while(!stack1.isEmpty()){ stack2.push(stack1.pop()); } int pop = stack2.pop(); while(!stack2.isEmpty()){ stack1.push(stack2.pop()); } return pop; }} 总结 以上就是本文关于Java编程用两个栈实现队列代码分享的全部内容,感兴趣的朋友可以参阅:Java编程用栈来求解汉诺塔问题的代码实例(非递归)、Java编程基础测试题分享、Java多线程ForkJoinPool实例详解等以及本站其他相关……

    12小时47分钟前回答

    java编程实现国际象棋棋盘

    本文实例为大家分享了java编程实现国际象棋棋盘的具体代码,供大家参考,具体内容如下 问题描述: 打印出国际象棋棋盘(黑白交错) 问题分析: 棋盘由八块黑白相间的方块组成,通过swing编程实现。其中用标签来实现方块,在方块中填充黑或白色。通过i,j来遍历行和列,以i和j的值来判断填充什么颜色 代码分析 import javax.swing.*;import java.awt.*;public class _2ChessBoard { public static void main(String[] args) { //新建窗口 JFrame jFrame=new JFrame("国际象棋棋盘"); //设置窗口的大小(八个格子,每个格子宽,高为20个像素) jFrame.setSize(160,160); //窗口的位置 jFrame.setLocation(300,300); //格子的行数,列数 int m=8; //格子的像素 in……