java并发编程-进程与线程
进程与线程的概念
程序是由指令和数据组成的, 但是指令需要运行, 数据要读写, 就必须将指令加载至cpu, 数据加载至内存。
java中线程是最小的调度单位, 进程是资源分配的最小单位。
进程: 当一个程序被运行, 从磁盘加载这个程序的代码至内存, 这时就开启了一个进程。
线程: 一个进程可以分为多个线程, 一个线程就是一个指令流,指令流中的指令交给CPU执行。
进程通信: 同一台计算机的进程通信称为IPC, 不同计算机通信需要通过网络, 遵守共同的协议, 例如http协议。
线程通信: 在进程内,共享进程的内存, 多线程可以共享变量。
并行和并发的区别
并发: 是指一个处理器同时处理多个任务。
并行: 是指多个处理器同时处理多个不同的任务。
线程的基本应用
1.异步调用:不需要方法的返回就能继续运行。
2.同步调用:需要方法的返回才能继续运行。
3.多线程应用之提高效率
案例一:
充分利用多核cpu核数优势, 并行计算, 相互计算之间没有依赖关系, 最后汇总结果。
4.创建和运行线程
第一种创建线程的方法:
public class CreateThread { private static final Logger LOG = LoggerFactory.getLogger(CreateThread.class); public static void main(String[] args) { Thread thread1 = new Thread("thread1"){ @Override public void run() { LOG.info("info2"); } }; thread1.start(); LOG.info("info1"); } }
第二种创建线程的方法(推荐使用):
public class CreateThread2 { private static final Logger LOG = LoggerFactory.getLogger(CreateThread2.class); public static void main(String[] args) { Runnable runnable =new Runnable() { @Override public void run() { //执行的任务 LOG.info("running"); } }; //创建线程 Thread t = new Thread(runnable,"t2"); t.start(); } }
jdk1.8之后使用lambda表达式创建线程精简代码:
如果接口带有@FunctionalInterface注解和只有一个抽象方法就可以使用lambda表达式, Runnable源码:
@FunctionalInterface public interface Runnable { /** * When an object implementing interface <code>Runnable</code> is used * to create a thread, starting the thread causes the object's * <code>run</code> method to be called in that separately executing * thread. * <p> * The general contract of the method <code>run</code> is that it may * take any action whatsoever. * * @see java.lang.Thread#run() */ public abstract void run(); }
lambda表达式(Alt+Enter快捷键转成lambda):
public class CreateThread2 { private static final Logger LOG = LoggerFactory.getLogger(CreateThread2.class); public static void main(String[] args) { Runnable runnable = () -> { //执行的任务 LOG.info("running"); }; //创建线程 Thread t = new Thread(runnable,"t2"); t.start(); } }
创建多线程第三种创建线程的方法, FutrueTask配合Thread:
public class CreateThread { private static final Logger LOG = LoggerFactory.getLogger(CreateThread.class); public static void main(String[] args) throws ExecutionException, InterruptedException { FutureTask<Integer> futureTask =new FutureTask<Integer>(new Callable<Integer>() { @Override public Integer call() throws Exception { LOG.info("running"); Thread.sleep(2000); return 100; } }); Thread t1 =new Thread(futureTask,"t1"); t1.start(); LOG.info("{}", futureTask.get()); } }
5.