多线程

本文深入探讨了Java中实现多线程的两种方法:继承Thread类与实现Runnable接口的区别及选择,分析了多线程的优缺点,并详细讲解了同步机制,包括synchronized关键字和ReentrantLock的使用方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值