IT技术篇

Java基础——多线程

2019-01-03  本文已影响0人  游戏原画设计

线程安全(更具体的会在多线程当中讲解):

安全 -- 同步 -- 数据是安全

不安全 -- 不同步 -- 效率高

安全和效率永远都是鱼和熊掌不可兼得。这个问题一直困扰着我们

安全:医院/银行的网站

效率:腾讯网/某某论坛 StringBuffer:

是一个线程安全可变的字符串。

StringBuffer和String有什么区别?

StringBuffer内容可变,String是不可变

如果说你的字符串需要经常的进行拼接,就是使用StringBuffer

如果你的字符串是固定不变了,那么就使用String

capacity:返回当前的容量 理论值

length:返回的是长度(字符数) 实际值

面试题:

StringBuilder、StringBuffer、String的区别?

a.String的内容不可变的,前两者都是可变的字符序列

b.StringBuilder,线程不同步,数据不安全,效率高

c.StringBuffer,线程同步,数据安全,效率低

StringBuffer和数组的区别?

二者本质上都是一个容器,可以装其他的一些数据

但是StringBuffer的数据的最终结果值是一个字符串类型

而数组可以放置多种数据乐西,但是必须保证是同一种数据类型

1.如果我们需要了解多线程,就必须先了解线程,需要了解线程的话,就必须先要了解什么是进程,因为所有的线程都是依赖于进程而存在的。

2.什么是进程?

我们刚才通过任务管理器就看到了进程的存在

而通过观察,只有我们运行的程序,才会产生进程。

进程实际上就是你的内存分配的一块空间给这个程序的使用的东西

进程是系统进行资源分配和调用的一个独立单位。每一个进程都有他自己的内存空间和系统资源。

3.多进程有什么意义呢?

如果你的计算机是单进程的,就说明你的计算机只能够同时执行一件事,但是我们现在的计算机能够同时支持多个任务,所以我们现在的计算机都是多进程的。

举例:开着极域,同时打游戏

也就是我们的现在的计算机是多进程,可以在一个时间段内执行多个任务。

并且呢,可以提高CPU的使用率

问题:

我一边玩吃鸡,一边打LOL是同时进行的吗?

不是,单CPU在某一个时间点内只能同时做一件事

而我们一边吃鸡,一边打撸,是CPU在交替的执行执行两个进程,只不过CPU的处理速度,我们几乎感觉不到。

4.什么是线程?

在一个进程里面又可以执行多个任务,这里的每个任务我们就可以看做一个线程

线程:是程序的执行单元,执行路径,是程序使用CPU的最小最基本的执行单位。

单线程:如果你的程序只有一条执行路径

多线程:如果程序有多条执行路径

5.多线程程序有什么意义?

多线程的存在,不是提高程序的执行效率。只是为了提高程序的使用率

程序的执行其实是需要抢夺CPU资源的,CPU的执行权。

多个进程在抢夺的系统资源的时候,如果你一个进程的执行路径比较多,那么就有更多的机会能够抢夺到资源。

我们不能保证哪个线程能够抢夺到资源,所以我们的线程执行是有严重的随机性。

多线程(掌握):

进程:正在执行的应用程序

线程:进程的执行单元。执行路径

单线程:一个程序只有一条执行路径

多线程:一个应用程序的多条执行路径

多进程的意义?

提高CPU的使用率

多线程的意义?

提供程序的使用率

Java的运行原理及JVM是多线程么?

a.java命令去启动jvm,jvm去启动一个进程,该进程会自动启动一个主线程(main)

b.JVM的启动是多线程的,因为最少启动了2个线程,一个主线程和一个垃圾回收

多线程的实现方式:

A.继承Thread类

B.实现Runnable接口

线程调用和优先级的问题:

A.线程的调度

a.分时调用

b.抢占式调用(Java就是采用这种)

获取线程的优先级

a.默认是5

b.范围1-10

线程的常见方法:

线程休眠

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()

获取线程优先级

public final int getPriority()

public final void setPriority(int newPriority)

同步对象锁:

实现Runnable出现的问题:

同过加入延迟之后,就产生了两个问题:

a.同一张票被卖了多次

因为CPU的操作必须是原子性

b.出现了负数票

因为CPU的随机性和延迟性所导致

如何解决:

首先想为什么出现问题?(也是我们判断是否有问题的标准)

a.是否是多线程环境 是

b.是否有共享数据 是

c.是否有多条语句操作共享数据 是

我们满足了所以出现问题的问,程序出现异常就和正常。

怎么去解决?

a.我们解决不了

b.我们也解决不了

c.我们是可以解决的

思想:

把多条语句的共享数据代码包装成一个整体,让某个线程在执行的时候,其他线程就必须等待。

问题我们也不知道怎么做啊,但是我知道Java提供了一个解决这个办法的东西:同步机制。

同步代码跨:

synchronized (对象) {

需要进行同步的代码

}

a.对象是什么?

我们随便创建一个对象

b.我们需要同步的代码是什么?

就是多条语句需要操作共享的代码(出问题的代码)

注意:

同步可以解决安全的问题根本原因就是在这个对象上面,以为这个对象就是锁对象

我们的锁,应该保证是同一把锁,而不是多把锁 自己锁自己

---------------------

Java。大家都知道,我们是学Java全栈的,大家就肯定以为我有全套的Java系统教程。没错,我是有Java全套系统教程,进扣裙【47】974【9726】所示,今天小编就免费送!~

“我们相信人人都可以成为一个程序员,现在开始,找个师兄,带你入门,学习的路上不再迷茫。这里是ja+va修真院,初学者转行到互联网行业的聚集地。"

上一篇下一篇

猜你喜欢

热点阅读