Java多线程入门

Process 与 Thread(20-12-08)

进程是执行程序的一次执行过程,它是一个动态的概念。是系统资源分配的单位

一个进程可以包含若干个线程,一个进程至少有一个线程,不然没有存在的意义。线程是CPU调度和执行的单位。

核心概念:

  • 线程就是独立的执行路径;
  • 在程序运行时,即使没有自己创建线程,后台也会有多个线程,如主线程, gc线程
  • main()称之为主线程,为系统的入口,用于执行整个程序;
  • 在一个进程中,如果开辟了多个线程,线程的运行由调度器安排调度,调度器是与操作系统紧密相关的,先后顺序是不能人为的干预的。
  • 对同一份资源操作时,会存在资源抢夺的问题,需要加入并发控制;
  • 线程会带来额外的开销,如cpu调度时间,并发控制开销。
  • 每个线程在自己的工作内存交互,内存控制不当会造成数据不一致
线程创建

Thread class----> 继承Thread类(重点)

Runnable接口----> 实现Runnable接口(重点)

Callable接口----> 实现Callable接口(了解)

方式一:

继承Thread类,重写run()方法,调用start开启线程

注意,线程开启不一定立即执行,由CPU调度执行

//启动线程start()开启方式
线程对象.start();

不建议使用:避免OOP单继承局限性

方式二

定义MyRunnable类实现Runnable接口

实现run()方法,编写线程执行体

创建线程对象,调用start()方法启动线程

//启动线程start()开启方式
new Thread(线程对象).start();

推荐使用:避免单继承局限性,灵活方便,方便同一个对象被多个线程使用

方式三

实现Callable接口(了解即可),需要返回值类型

重写call方法,需抛出异常

创建目标对象

创建执行服务:ExecutorService ser=Executor.newFixedThreadPool(1);

提交执行:Future result1=ser.submit(t1);

获取结果:boolean r1=result1.get();

关闭服务:ser.shutdownNow();

Lambda表达式(20-12-08)

只有一个方法的才叫 函数式接口 才可以用 lambda

public class TestLambda1 {
    public static void main(String[] args) {

        ILove love=(int a)->{//lambda表达式
            System.out.println("i love you-->"+a);
        };
        love.love(520);
//总结
        //lambda表达式只能是在只有一行代码的情况下才能简化为一行,如果有多行,那么就要代码块包裹。
        //前提是接口为函数式接口,只有一个方法的才叫 **函数式接口** 才可以用 lambda表达式
        //多个参数也可以去掉参数类型,要去掉就都去掉,必须加上括号。

    }
}
interface ILove{
    void love(int a);
}

静态代理模式(20-12-08)

总结://要使用lambda表达式

真实对象和代理对象都要实现同一个接口

代理对象要代理真实对象

好处:

代理对象可以做很多真实对象做不了的事

真实对象可以专注做自己的事

本人学习Java的一片私人空间……
原文地址:https://www.cnblogs.com/none-space/p/14105751.html