Java并行与并发
转自己的学习笔记:2016-09-26
代码没有流程控制前提下,代码是从上而下逐行执行的。
若要打游戏和放音乐同时运行(多任务同时运行),要使用多进程或多线程来解决。
并行和并发:
并行:指两个或多个事件在同一时刻点发生;(微观)
并发:至两个或多个事件在同一个时间段内发生;(宏观)
在操作系统中,再多到程序环境下,并发性是指在一段时间内宏观上有多个程序在同时运行,但在单CPU系统中,每个时刻却仅能有一道程序执行(时间片),故微观上这些程序只能是分时的交替执行。
倘若计算机系统有多个CPU,则这些可以并发执行的程序便可并发执行的程序便可分配到多个处理器上,实现多任务并行执行,即利用每个处理器来处理一个可并发执行的而程序。
同理,线程也是一样的,从宏观上线程是并行运行的,但微观是串行的。
进程与线程:
java操作进程:
方法1:使用runtime类的exec方法
Runtime runtime= Runtime.getRuntime();
runtime.exec("notepad");//调用系统里的记事本程序
方法2:使用ProccessBuilder
ProccessBuilder pd=new ProccessBuilder("notepad");
pb.start();
创建和启动线程:
方法1:继承thread类;
方法2:实现runnable接口;
线程类(java.lang.Thread):thread类和thread子类才能称之为线程类;
方式1:继承thread类
1:定义一个类A继承于java.lang.Thread类
2:在A类中覆盖thread类中的run方法
3:在run方法中编写需要执行的操作,线程执行体。
4:在main方法(线程)中,创建线程对象,并启动线程
创建线程类对象:A类 a= new A类();
调用线程对象的start方法;a.start();//启动一个线程
注意:不要调用run方法,因为不会开启新线程;
方式2:实现runnable接口
使用匿名内部类创建并启动线程
用线程方式实现吃苹果比赛
使用runnable方式
线程不安全问题分析
同步代码块
同步方法
synchronized的好与坏:
如同stringbuffer与stringbuilder的区别:(性能好与坏,安全高与低)
单例模式-懒加载
存在线程不安全问题
推荐使用饿汉式。
双重检查锁机制:
锁机制(lock)
Java SE5的java.util.concurrent包中的执行器(Executor)将为你管理Thread对象,从而简化了并发编程。Executor在客户端和执行任务之间提供了一个间接层,Executor代替客户端执行任务。Executor允许你管理异步任务的执行,而无须显式地管理线程的生命周期。Executor在Java SE5/6中时启动任务的优选方法。Executor引入了一些功能类来管理和使用线程Thread,其中包括线程池,Executor,Executors,ExecutorService,CompletionService,Future,Callable等。
一、创建线程池
Executors类,提供了一系列工厂方法用于创先线程池,返回的线程池都实现了ExecutorService接口。
public static ExecutorService newFixedThreadPool(int nThreads)
创建固定数目线程的线程池。
public static ExecutorService newCachedThreadPool()
创建一个可缓存的线程池,调用execute 将重用以前构造的线程(如果线程可用)。如果现有线程没有可用的,则创建一个新线程并添加到池中。终止并从缓存中移除那些已有 60 秒钟未被使用的线程。
public static ExecutorService newSingleThreadExecutor()
创建一个单线程化的Executor。
public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize)
创建一个支持定时及周期性的任务执行的线程池,多数情况下可用来替代Timer类。