Java-多线程(二) 线程的使用

一 线程的创建和启动
方式1:继承Thread类

1.自定义一个类继承Thread类,这个类就是多线程类.
2.[重写]Thread类里面的run方法,把需要执行的自定义线程代码放入这个run方法.
3.创建线程类对象
4.开启线程,使用start()方法
[优点]: 编程简单
[缺点]: Java是一个单继承的语言,一旦一个类继承了Thread类,就无法再继承其他类.

方式2:实现Runnable接口

1.自定义一个类,[实现]Runnable接口
2.实现Runnable接口中唯一的方法run(),把线程的代码写入到run()
3.创建Thread类对象,并且把[实现]Runnable接口的自定义类对象作为参数传入到Thread构造方法中
4.调用Thread类对象的start方法,开启线程
[优点]: 可以继承其他类,更方便多个线程共享一个资源 
[缺点]: 编程稍微复杂.需要将定义的实现类作为参数传入到Thread的构造方法中.

创建方式3:实现Callable
JDK1.5 之后的新特性
需要导入包

import java.util.concurrent.Callable;
1.自定义一个类,[实现]Callable接口
2.实现Callable接口中唯一方法call().
3.call()方法的特点:有返回值,抛出异常,支持泛型,如果没有返回值,如果没有抛出检查异常,建议使用方式12
4.创建一个FutureTask对象,将上面的实现类对象作为参数传入FutureTask类对象,创建Thread类对象,将FutureTask类对象作为参数传入Thread类对象.
5.调用Thread类对象的start方法,开启线程

二 Thread 常用方法

run();                  线程体
Thread(String name);    初始化线程的名字,属于线程的一个有参数的构造方法
setName(String name);   修改线程的名字
getName();              获取线程的名字
start();                开启自定义线程,执行线程中的run方法
static sleep();         通过Thread类名调用,这里需要处理一些异常.要求当前线程停止固定毫秒
static currentThread(); 返回当前的线程对象,返回值:[线程名,优先级,线程组名]
getPriority();          返回当前线程的优先级CPU执行的优先级,不是绝对的
setPriority();          设置线程的优先级
    [注]: 线程优先级等级越高,执行概率越高

三 线程的生命周期
线程的生命周期:新建(New)、就绪(Runnable)、运行(Running)、阻塞(Blocked)和死亡(Dead)5种状态。
这里写图片描述
这张图还是挺重要的,能够帮助我们理解JVM处理Thread的过程.其中 t 是主线程 Thread 是我们新建的线程, o 是同步监听器对象.

四 线程同步
方式1 同步代码块
使用synchronized关键字:

synchronized(同步监视器) {
    需要同步的代码块
}

1.同步监视器必须是引用数据类型,不能是基本数据类型,也最好不是String和Integer.
2.被锁住的对象可以改变值,但不会改变引用,所以建议用final修饰.
3.sleep()不会释放锁对象,不会开锁.
4.线程安全,但开销大.效率低,甚至出现“死锁”的现象.

方式2 同步代码
直接对方法进行同步

public void run() {
    method();
}

public synchronized void method() {
    需要同步的代码
}

1.不要将run()置为同步方法,否则就变成串行了
2.此时同步监视器是 this. 所以一个同步方法被锁定,当前类的所有同步方法都被锁定

方式3 Lock
JDK1.5的新特性,具体方法在另一篇博客中有介绍https://www.cnblogs.com/dolphin0520/p/3923167.html

猜你喜欢

转载自blog.csdn.net/Yolandera/article/details/82534896