多线程

Posted zwcnblog

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多线程相关的知识,希望对你有一定的参考价值。

一、创建线程

       1.1 继承Thread

       步骤:1、自定义异常类继承Thread类

                2、重写run()方法

                3、创建线程对象

                4、启动线程:线程对象.start();

      1.2 实现Runnable接口(注意也可以是匿名内部类的方式)

       步骤:1、自定义类实现Runnable接口

                2、重写run();方法

                3、创建自定义类对象(注意:这不是一个线程对象,只有继承Thread的子类才是线程类)

                4、创建线程,使用Thread(Runnable target)构造器,将自定义类对象作为参数传递。

                5、启动线程:线程对象.start();

二、Thread类

       2.1 常用构造方法

              Thread()

    Thread(String name)

              Thread(Runnable target)

              Thread(Runnable target, String name)  

       2.2 常用方法

              static Thread currentThread()  :返回当前线程对象

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

              int getPriority(): 返回线程的优先级。

              void setPriority(int newPriority) :更改线程的优先级。

              Thread.State getState()返回该线程的状态,状态是枚举类。

              boolean isDaemon() :测试该线程是否为守护线程。

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

              void join() :某个线程调用该方法加入到另一个线程中,另一个线程等待该线程执行完毕后再继续执行。

              void run() :里面写业务

              static void sleep(long millis) :正在执行的线程休眠

              void start() :使该线程开始执行,执行run方法

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

三、线程同步

加锁原则:尽可能缩小加锁的范围,提高程序效率

       3.1 同步代码块

              synchronize(同步监听对象){

                  需要被同步的代码

              }

              注意:监听对象可以是任意的,但是要保证多个线程访问到的是同一个对象。常用当前类的字节码对象。

       3.2 同步方法

              使用synchronize修饰方法,放在返回值类型前面,不需要写同步监听对象,实例方法默认监听对象是this,静态方法默认监听对象是当前类的字节码对象。

       注意:继承的方式的话,建议使用同步代码块,因为this不是同一个对象,虽然通过static修饰方法是可以的,但是这样不好,一般static用于工具类方法。

       3.3 锁机制

       通过:private final ReentrantLock lock = new ReentrantLock();//创建锁对象

       语法:lock.lock();  //加锁

                try {

                     //需要同步的代码

                   } finally {

                            //通常释放资源                 

                            lock.unlock();//解锁

                   }

       注意:1、这种方式和前面两种方式一样,必须保证锁是同一个对象。(继承方式需要static修饰锁,实现不需要)

四、线程通信

三个方法:   均是Object方法

       void wait() :在其他线程调用此对象的 notify() 方法或 notifyAll() 方法前,导致当前线程等待。

       void notify() :唤醒在此对象监视器上等待的单个线程。

       void notifyAll():唤醒在此对象监视器上等待的所有线程。

以上是关于多线程的主要内容,如果未能解决你的问题,请参考以下文章

什么是多线程,多进程?

多线程和多进程模式有啥区别

多线程Java多线程学习笔记 | 多线程基础知识

java中啥叫做线程?啥叫多线程?多线程的特点是啥

c++ 多线程与c多线程有啥区别?

IOS多线程安全(线程锁)