使用多线程的好处,在于并行的执行多任务,彼此独立,可以提高执行效率。在java中实现多线程有两个途径,一种是继承Thread类,一种是实现Runnable接口。
无论是哪种方式,用户都是在run()方法内书写逻辑代码,实现想要进行的操作。实际上Thread类也是实现了Runnable接口的,关于这两种方式,官方给出了解释,选择实现Runnable接口创建线程,更有利于资源的共享,并且对能避免java中单继承的限制。启动线程并不是直接调用run()方法,虽然这样也可以启动线程,一般来说调用start()方法启动线程,随后会自动执行run()的方法主体。多线程情况下,哪个线程最先执行,取决于谁最先获得CPU资源。
java的内存设计既有主存,又有线程工作内存,多个线程共享主存,线程之间的数据彼此独立,但它们修改的数据都是来源于主存,若同一时间存在多个线程同时对某个数据进行修改,那么数据将出现失真,会出现与预期的效果不一样的结果,如何避免这种情况,就要使用线程同步。在需要同步的方法处,添加synchronized修饰符,也可以在需要同步的代码块用synchronized修饰,当前线程退出同步方法时,会释放掉所属对象的隐式的锁。
另外也可以使用加锁机制保护共享资源,Lock lock = new ReentrantLock();//创建锁
在需要锁的代码处,调用lock()方法取得锁,事物执行完后,调用unlock()方法释放锁,锁可以拥有一个或多个相关的条件对象,在使用Lock时,必须使用Condition Variable对象。在实际的开发中,一般采用synchronized表示同步代码块或同步方法。
java多线程还有一个很重要的概念:线程池。线程池的出现在一定程度上减少了创建和销毁线程所带来的时间和空间上的时间消耗,从而提高了效率。通过手动的设置线程池中的线程数量,使程序运行达到最佳效果。当一个新任务需要执行的时候,如果线程池中有可以运行的工作线程,就可以开始运行了,否则进入等待队列。执行器Executor类有大量用来创建线程池的静态方法,如newFixedThreadPool方法,创建指定数量的线程数。一般来说,真正的线程池接口是ExecutorService,由他创建线程池。使用线程池应该要有的几个步骤:1)调用Executor类的静态方法 newFixedThreadPool 或 newCachedThreadPool,如:ExecutorService pool = Executor.newFixedThreadPool(10)//创建指定数量为10的线程池;2)调用submit来提交一个Runnable 或 Callable 对象 ;3)如果希望能够取消任务或如果提交了一个Callable对象,那就保存好返回的Future 对象;4)当不想提交任何任务时调用shutdown方法。
关于java多线程的简单理解
内容版权声明:除非注明,否则皆为本站原创文章。