gzyueqian
13352868059

每一个java程序员都应该具备的java编程思想

更新时间: 2019-10-29 15:04:54来源: 粤嵌教育浏览量:8903

         java编程思想是每一个想要学习java语言或者是已经从事java语言相关工作的人都应该要具备的思想,java编程思想就是让所有的事物在任何的时刻只能用一个执行步骤去执行任务,并发编程,程序可以并行的执行程序中的多个任务。那么每一个java程序员都应该具备的java编程思想是怎么样的呢?下面粤嵌科技java培训班的讲师就给大家来科普下:

  1 、定义任务

  线程可以驱动任务,因此你需要一种描述任务的方式,这可以由Runnable接口来提供。要想定义任务,只需实现Runnable接口并编写run()方法,使得该任务可以执行你的命令。

  当从Runnable导出一个类时,它必须具有run()方法,但是这个方法并无特殊之处——它不会产生任何内在的线程能力。要实现线程行为,你必须显式地将一个任务附着到线程上。

  2、 使用Executor

  FixedThreadPool 与 CachedThreadPool

  FixedThreadPool, 可以一次性预先执行代价高昂的线程分配,因而也就可以限制线程的数量了。这可以节省时间,因为你不用为每个任务都固定地付出创建线程的开销。在事件驱动的系统中,需要线程的事件处理器,通过直接从池中获取线程,也可以如你所愿地得到服务。你不会滥用可获得的资源,因为FixedThreadPool使用的Thread对象的数量是有界的。

  3 、从任务中产生返回值

  Runnable是执行工作的独立任务,但是它不返回任务值。如果你希望任务在完成时能够返回一个值,那么可以实现Callable接口而不是Runnable接口。在Java SE5中引入的Callable是一种具有类型参数的泛型,它的类型参数表示的是从方法call()(而不是run())中返回的值,并且必须使用ExecutorService.submit()方法调用它。

  4、 编码的变体

  另一种可能会看到的惯用法是自管理的Runnable。

  这与从Thread继承并没有什么特别的差异,只是语法稍微晦涩一些。但是,实现接口使得你可以继承另一个不同的类,而从Thread继承将不行。

  5、 线程组

  线程组持有一个线程集合。线程组的价值可以引用Joshua Bloch的话来总结:“把线程组看成是一次不成功的尝试,你只要忽略它就好了。”

  6 、捕获异常

  由于线程的本质特性,使得你不能捕获从线程中逃逸的异常。一旦异常逃出任务的run()方法,它就会向外传播到控制台,除非你采取特殊的步骤捕获这种错误的异常。

  7、 共享受限资源

  可以把单线程程序当作在问题域求解的单一实体,每次只能做一件事情。

  8、 不正确地访问资源

  因为canceled标志是boolean类型的,所以它是原子性的,即诸如赋值和返回值这样的简单操作在发生时没有中断的可能,因此你不会看到这个域处于在执行这些简单操作的过程中的中间状态。

  有一点很重要,那就是要注意到递增程序自身也需要多个步骤,并且在递增过程中任务可能会被纯种机制挂起——也就是说,在Java中,递增不是原子性的操作。因此,如果不保护任务,即使单一的递增也不是安全的。

  9、线程之间的协作

  wait()与notifyAll()

  wait()使你可以等待某个条件发生变化,而改变这个条件超出了当前方法的控制能力。通常,这种条件将由另一个任务来改变。你肯定不想在你的任务测试这个条件的同时,不断地进行空循环,这被称为忙等待, 通常是一种不良的周期使用方式。因此wait()会在等等外部世界产生变化的时候将任务挂起,并且只有在notify()或notifyAll() 发生时,即表示发生了某些感兴趣的事物,这个任务才会被唤醒并去检查所产生的变化。因此,wait()提供了一种在任务之间对活动同步的方式。

  调用sleep()的时候锁并没有被 释放,调用yield()也属于这种情况,理解这一点很重要。

  wait(), notify()以及notifyAll()有一个比较特殊的方面,那就是这些方法是基类Object的一个部分,而不是属于Thread的一部分。

  错失的信号。

  notify() 与 notifyAll()

  在有关Java的线程机制的讨论中,有一个令人困惑的描述: notifyAll()将唤醒“所有下在等等的任务”。这是否意味着在程序中任何地方,任何处于wait()状态中的任务都将被任何对notifyAll()的调用唤醒呢?有示例说明情况并非如此——事实上,当notifyAll()因某个特定锁而被调用时,只有等待这个锁的任务才会被唤醒。

  总结

  线程的一个额外好处是它们提供了轻量级的执行上下文切换(大约100条指令),而不是重量级的进程上下文切换(要上千条指令)。因为一个给定进程内的所有线程共享相同的内存空间,轻量级的上下文切换只是改变了程序的执行序列和局部变量。进程切换(重量级的上下文切换)必须改变所有内存空间。

  以上就是粤嵌科技的小编给大家整理的关于java编程思想的内容,每一个程序员都应该要具备好的编程思想。只有你有完整的编程思想,那么在以后的工作中才不会在遇到问题的时候手忙脚乱。如果说你想要学习java语言的话,那么可以点击我们文章下面的获取试听资格按钮来获取我们的java培训免费课程试听资格,来和我们的讲师进行面对面的交流和沟通并更加深入的了解我们粤嵌科技。

免费预约试听课