多线程

tech2022-09-14  113

1、 继承Thread类和实现Runnable接口的区别,如何选择? 区别: a、 步骤上,定义类继承Thread→复写Thread类中的run方法, 定义类实现Runnable接口→覆盖Runnable接口中的run方法; b、 前者是多个线程分别完成自己的任务,后者是多个线程共同完成一个任务; c、 实现Runnable接口可以继承多接口,弥补Java的单继承性; d、 继承Thread: 线程代码存放Thread子类run方法中。 实现Runnable,线程代码存在接口的子类的run方法。 选择: 实现Runnable接口能对一个任务进行多线程处理,所以一般情况下都是选择它。

2、 多线程的优劣? 优点:提高资源利用率; 劣势:某些情况下会导致对共享资源的重复处理造成错误;

3、 重复处理 哪些防止方法?synchronized关键字怎么用?其他方式怎么用?大概是怎样的原理? a) 一般会加锁,主要有:synchronized关键字和lock的的主要实现类——reentrantLock; b) synchronized关键字使用分为以下几种: i.范围操作符之后,返回类型声明之前。此时线程获得成员锁,一次只能一个线程进入该方法,其他线程排队等候;

pubic synchronized void A(){ //方法体 }

ii. synchronized后跟(变量),是对这个代码块使用。此时线程获得成员锁,一次只能一个线程进入代码块。

public int A(int a){ synchronized(a){ } }

iii. synchronized修饰对象。一般项目中不会采取。如果一个对象包含很多种资源,不会为了一个线程使用其中一部分资源而将其他所有线程锁在外面。相反,使用synchronized时,要使锁住的内容尽可能的小,即:将内容原子化(比如细化到一个文件内的一个文档乃至更小),这样会格外提高多线程的资源利用率。

public void run(){ synchronized(this){ } }

c) reentrantLock使用: i.获取锁,若当前线程被打断,会发生阻塞,直至成功获取;

void lock()

ii. 获取锁,可中断,若获取之前当前线程被打断,会在获取之后抛出InterruptedException,并停止当前线程;

void lockInterruptibly() throw InterruptedException;

iii. 尝试获得锁,成功立即返回true,否则返回false;

boolean trylock();

iv. 获取锁,设置额定时间,超时返回false

boolean trylock(long time,TimeUnit Unit) throws InterruptedException;

v. 释放锁;

void unlock();

vi. 生产者消费者 Synchronized仓库实例 线程状态、转换、控制 1

最新回复(0)