多线程

来源:互联网 发布:mac磁盘分区合并 编辑:程序博客网 时间:2024/06/02 16:17
多线程:
多线程的概念:
* 线程是程序执行的一条路径, 一个进程中可以包含多条线程
* 多线程并发执行可以提高程序的效率, 可以同时完成多项工作

并行和并发的区别

JVM启动至少启动了垃圾回收线程和主线程,所以是多线程的。

多线程的实现:
方式一:
定义类继承Thread
重写run方法
把新线程要做的事写在run方法中
创建线程对象
开启(调用start())新线程, 内部会自动执行run方法
方式二:
定义类实现Runnable接口
实现run方法
把新线程要做的事写在run方法中
创建自定义的Runnable的子类对象
创建Thread对象, 传入Runnable
调用start()开启新线程, 内部会自动调用Runnable的run()方法

查看方式二 实现Runnable接口的源码

多线程两种实现方式的区别:
* 继承Thread
* 好处是:可以直接使用Thread类中的方法,代码简单
* 弊端是:如果已经有了父类,就不能用这种方法
* 实现Runnable接口
* 好处是:即使自己定义的线程类有了父类也没关系,因为有了父类也可以实现接口,而且接口是可以多实现的
* 弊端是:不能直接使用Thread中的方法需要先获取到线程对象后,才能得到Thread的方法,代码复杂

匿名内部类实现线程的两种方式

public final String getName():获取线程对象的名称。默认情况下,名字的组成 Thread-编号(编号从0开始)
public final void setName(String name):设置线程名称。
public static Thread currentThread():返回当前正在执行的线程对象引用
public static void sleep(Long time):让当前线程休眠time毫秒
public final void setDaemon(boolean on):设置线程为守护线程,一旦前台(主线程),结束,守护线程就结束了。
public final void join():当前线程暂停, 等待指定的线程执行结束后, 当前线程再继续
public final void join(int time):当前线程暂停, 等待指定的线程执行time秒结束后, 当前线程再继续
public static void yield():暂停当前正在执行的线程对象,并执行其他线程。
public final int getPriority():获取线程优先级
public final void setPriority(int newPriority):更改线程的优先级。
线程默认优先级是5。范围是1-10。
注意:优先级可以在一定的程度上,让线程获较多的执行机会。


同步代码块
什么情况下需要同步
* 当多线程并发, 有多段代码同时执行时, 我们希望某一段代码执行的过程中CPU不要切换到其他线程工作. 这时就需要同步.
* 如果两段代码是同步的, 那么同一时间只能执行一段, 在一段代码没执行结束之前, 不会执行另外一段代码.
什么是同步代码块
* 使用synchronized关键字加上一个锁对象来定义一段代码, 这就叫同步代码块
* 多个同步代码块如果使用相同的锁对象, 那么他们就是同步的
synchronized(任意对象 但是必须是同一个){

}

同步方法
使用synchronized关键字修饰一个方法, 该方法中所有的代码都是同步的 
非静态同步函数的锁是当前对象this
静态的同步函数的锁是当前类的字节码对象


多线程卖票案例:
多线程并发操作同一数据时, 就有可能出现线程安全问题
使用同步技术可以解决这种问题, 把操作数据的代码进行同步
注意:同一数据什么时候加static
锁对象什么时候用this
死锁:
怎么出现的:就是同步代码块的嵌套就容易出现死锁
0 0