java 之 API-多线程

这里写图片描述
这里写图片描述
这里写图片描述

多线程概述

多线程概述
进程:
    正在运行的程序,是系统进行资源分配和调用的独立单位。
    每一个进程都有它自己的内存空间和系统资源。
线程:
    是进程中的单个顺序控制流,是一条执行路径
    一个进程如果只有一条执行路径,则称为单线程程序。
    一个进程如果有多条执行路径,则称为多线程程序。

java程序运行原理

Java程序运行原理
java 命令会启动 java 虚拟机,启动 JVM,等于启动了一个应用程序,也就是启动了一个进程。该进程会自动启动一个 “主线程” ,然后主线程去调用某个类的 main 方法。所以 main方法运行在主线程中。在此之前的所有程序都是单线程的。

如何获取和设置线程名称

Thread类的基本获取和设置方法
    public final String getName()
    public final void setName(String name)
    其实通过构造方法也可以给线程起名字

线程调度

    假如我们的计算机只有一个 CPU,那么 CPU 在某一个时刻只能执行一条指令,线程只有得到 CPU时间片,也就是使用权,才可以执行指令。那么Java是如何对线程进行调用的呢?

线程有两种调度模型:
    分时调度模型   所有线程轮流使用 CPU 的使用权,平均分配每个线程占用 CPU 的时间片
    抢占式调度模型   优先让优先级高的线程使用 CPU,如果线程的优先级相同,那么会随机选择一个,优先级高的线程获取的 CPU 时间片相对多一些。 
    Java使用的是抢占式调度模型。
    演示如何设置和获取线程优先级
    public final int getPriority()
    public final void setPriority(int newPriority)

线程控制

我们已经知道了线程的调度,接下来我们就可以使用如下方法对象线程进行控制
线程休眠
    public static void sleep(long millis)
线程加入
    public final void join()
线程礼让
    public static void yield()
后台线程
    public final void setDaemon(boolean on)
中断线程
    public final void stop()
    public void interrupt()

这里写图片描述

多线程的实现方案2

实现Runnable接口
    如何获取线程名称
    如何给线程设置名称
实现接口方式的好处
    可以避免由于Java单继承带来的局限性。
    适合多个相同程序的代码去处理同一个资源的情况,把线程同程序的代码,数据有效分离,较好的体现了面向对象的设计思想。

同步的特点

同步的前提
    多个线程
        多个线程使用的是同一个锁对象
    同步的好处
        同步的出现解决了多线程的安全问题。
    同步的弊端
        当线程相当多时,因为每个线程都会去判断同步上的锁,这是很耗费资源的,无形中会降低程序的运行效率。

JDK5中Lock锁的使用

    虽然我们可以理解同步代码块和同步方法的锁对象问题,但是我们并没有直接看到在哪里加上了锁,在哪里释放了锁,为了更清晰的表达如何加锁和释放锁,JDK5以后提供了一个新的锁对象Lock
Lock
    void lock()
    void unlock()
ReentrantLock

死锁问题

同步弊端
    效率低
    如果出现了同步嵌套,就容易产生死锁问题
    死锁问题
    是指两个或者两个以上的线程在执行的过程中,因争夺资源产生的一种互相等待现象

线程间通信

针对同一个资源的操作有不同种类的线程
举例:卖票有进的,也有出的。

通过设置线程(生产者)和获取线程(消费者)针对同一个学生对象进行操作

这里写图片描述

线程组

Java中使用ThreadGroup来表示线程组,它可以对一批线程进行分类管理,Java允许程序直接对线程组进行控制。
默认情况下,所有的线程都属于主线程组。
    public final ThreadGroup getThreadGroup()
我们也可以给线程设置分组
    Thread(ThreadGroup group, Runnable target, String name)

线程池

    程序启动一个新线程成本是比较高的,因为它涉及到要与操作系统进行交互。而使用线程池可以很好的提高性能,尤其是当程序中要创建大量生存期很短的线程时,更应该考虑使用线程池。
    线程池里的每一个线程代码结束后,并不会死亡,而是再次回到线程池中成为空闲状态,等待下一个对象来使用。
    在JDK5之前,我们必须手动实现自己的线程池,从JDK5开始,Java内置支持线程池

DK5新增了一个Executors工厂类来产生线程池,有如下几个方法
    public static ExecutorService newCachedThreadPool()
    public static ExecutorService newFixedThreadPool(int nThreads)
    public static ExecutorService newSingleThreadExecutor()
    这些方法的返回值是ExecutorService对象,该对象表示一个线程池,可以执行Runnable对象或者Callable对象代表的线程。它提供了如下方法
Future<?> submit(Runnable task)
<T> Future<T> submit(Callable<T> task)

匿名内部类方式使用多线程

匿名内部类方式使用多线程
new Thread(){代码…}.start();
New Thread(new Runnable(){代码…}).start();

定时器

定时器是一个应用十分广泛的线程工具,可用于调度多个定时任务以后台线程的方式执行。在Java中,可以通过Timer和TimerTask类来实现定义调度的功能
    Timer
    public Timer()
    public void schedule(TimerTask task, long delay)
    public void schedule(TimerTask task,long delay,long period)
TimerTask
    public abstract void run()
    public boolean cancel()
开发中
    Quartz是一个完全由java编写的开源调度框架。

设计模式

设计模式概述
    什么是设计模式
设计模式分类
    创建型模式
    行为型模式
    结构型模式

单例设计模式

单例设计思想
    保证类在内存中只有一个对象
如何实现类在内存中只有一个对象呢?
    构造私有
    本身提供一个对象
    通过公共的方法让外界访问

Runtime类的概述和使用

Runtime类概述
    每个 Java 应用程序都有一个 Runtime 类实例,使应用程序能够与其运行的环境相连接。可以通过 getRuntime 方法获取当前运行时。 
    应用程序不能创建自己的 Runtime 类实例。 
Runtime类使用
    public Process  exec(String command)
发布了65 篇原创文章 · 获赞 57 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/LiuMiao1128/article/details/53229481