您的位置:首页 > 职场人生

黑马程序员_多线程有关问题

2015-08-24 17:20 393 查看


-----Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流------

我们需要学习的是多线程,那么要学习多线程,我们首先要学习线程.而线程是依赖于进程的,所有我们需要学习进程.

1. 什么是进程?

通过任务管理器,可以查看到进程,所谓的进程就是正在执行的程序.

2. 多进程的意义?

如果计算机是单进程,那么指定一次执行一个程序.而我们现在的计算机都是多进程. 那么也就是说我们可以一边玩游戏一边听音乐.

提高CPU的使用率.

我们一边 玩游戏一边听音乐.存在两个进程,那么这个两个进程是同时执行的吗?同时: 指的是在一个时间点

不是同时执行的,因此CPU在一个时间点上只能执行一个任务,而我们看到的像是同时执行,其实是这样子的.是CPU在这个两个进程之间进行高效的切换.

3. 什么是线程?

一个应用程序可以执行多个任务,而每一个任务就是一个线程.

4. 多线程的意义?

多线程的意义不是提高程序的运行效率,而是提高程序的使用率.

如何理解这句话呢?

我们程序在执行的时候其实都是在抢占CPU的时间片(CPU的执行权). 如果一个应用程序只有一个任务,而另一个应用程序有多个任务,那么那个应用

抢占到CPU的执行权的概率大呢?是多个任务的应用程序抢到的概率比较大.多个任务的应用程序一定就可以抢占到CPU的执行权吗?不一定,所以多线程的执行具有随机性.

并发和并行的区别:

并发: 就是在一个时间点上

并行: 就是在一个时间段上

5. JVM的运行原理:

我们在使用java命令的时候是运行对应的程序吧,这时候是运行的JVM吧,那么这个JVM的运行就相当于启动了一个

进程,并且他会自动启动一个线程,这个线程就是主线程,这个主线程是用来调用我们的main方法 .

6. jvm的运行是多线程的吗?

是多线程,因此至少存在两个线程一个是主线程,一个是垃圾回收线程.

那么我们用该这么实现多线程呢?

两种方法:实现多线程的两个方式:

第一种方式:

步骤:

a: 创建一个类,然后让这个类继承Thread

b: 重写run方法

c: 创建该类的对象

d: 启动线程类

创建一个MyThread类,然后让这个类继承Thread

实现线程的第二种方式:

步骤:

a: 创建一个类,然后让这个类去实现Runnable接口

b: 复写run方法

c: 创建定义的类的对象

d: 创建Thread类的对象,然后把C中的对象作为参数传递进来

e: 启动线程

这两种方式: 第二种方式相对比较友好一点点.因为其解决了继承带来的局限性

创建一个MyThread类,然后让这个类去实现Runnable接口

线程中所使用的方法有哪些?

如何来获取线程的名称以及给线程设置名称:

public final String getName():返回该线程的名称。

public final void setName(String name)改变线程名称,使之与参数 name 相同。

举例为:

使用构造方法给线程设置名称

MyThread t1 = new MyThread("小强") ;

MyThread t2 = new MyThread("小迪") ;

另外一种:创建对象

MyThread t1 = new MyThread() ;

MyThread t2 = new MyThread() ;

调用setName(String name);设置线程名称

t1.setName("小强") ;

t2.setName("小迪") ;

线程的调度以及线程的优先级:

调度模型:

分时调度模型:
给每一个线程分配指定的时间,来完成线程的执行

抢占式调度模型:
优先执行优先级高的线程,如果多个线程的优先级相同,随机执行一个

而我们的java语言采用的就是抢占式调度模型

抢占式调用模型涉及到线程的优先级,而我们先在没有给线程设置优先级,那么应该存在默认的优先级.

我们可以通过 public final int getPriority()返回线程的优先级

进过调取该方法我们可以得到:

线程的默认的优先级是5

线程的优先级有一个范围: 这个范围是1-10

但是虽然我们设置了优先级,设置的优先级仅仅表示这个线程获取到CPU的执行权的概率增大了,一两次的运行说明不了问题

设置线程的优先级public final void setPriority(int newPriority)更改线程的优先级。

线程休眠机制:

Mythread类为:

了解线程礼让与线程守护:

线程礼让:

public static void yield()暂停当前正在执行的线程对象,并执行其他线程。

yield这个暂停线程的时间太短了,这时候别的线程有可能没有抢占到CPU的执行权,这时候该线程醒了,那么可以继续在和别的线程在抢占CPU的执行权

线程守护:

public final void setDaemon(boolean on)将该线程标记为守护线程或用户线程。

线程终端的两种方式:stop() 与 interrupt()

Mythread类为:

通过多线程的学习我们做了模拟电影院出票的多线程模式

出票的sellTickets类为:

但是这样写有bug ,当最后为1时三个窗口都可能别加载进入if判断中sleep等待休眠结束开始运行时打印出0 和 -1 .为了解决这个问题我们可以用以下方法改善

出票的sellTickets类为:

了解:

同步代码块的锁是,是任意的对象

同步方法的锁对象到底是谁呢?格式:public synchronized void sellTicket() 锁对象是this

静态同步方法的锁对象到底是谁呢?格式:public static synchronized void sellTicket() 锁对象是当前类的字节码文件对象

通过这些例子我们可以很好地认识多线程的原理以及调用Thread中的方法.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: