Java多线程学习

为什么学习多线程?

可以干什么

 处理大文件,处理请求,处理上网验证码,火车购票窗口,用户登录,学校门禁等等·。无需等待更多时间,效率也会更高,比如下载文件时如果使用java多线程的话,就能够同时下载多个文件。

举个简单的例子
假设有个请求,这个请求服务端的处理需要执行3个很缓慢的IO操作(比如数据库查询或文件查询),那么正常的顺序可能是(括号里面代表执行时间):

a读取文件1 (10ms)
b处理1的数据(1ms)
c读取文件2 (10ms)
d处理2的数据(1ms)
e读取文件3 (10ms)
f处理3的数据(1ms)
整合1、2、3的数据结果 (1ms)
单线程总共就需要34ms。

那如果你在这个请求内,把ab、cd、ef分别分给3个线程去做,就只需要12ms了。

Java具体实现

接口的实现 Runnable

Runnable接口的优点:
可以避免由于Java单继承带来的局限性(不占继承名额)
适合多个相同程序的代码去处理同一个资源的情况
把线程同程序的代码,数据有效分离,较好的体现了面向对象的设计思想
Runnable类

public interface Runnable {
	public abstract void run();
}

例子
public void run() { // //卖票的方法
while (true){
if (counnt <= 0){
break;
}
else
{
num ++;
counnt --;
System.out.println(Thread.currentThread().getName() + “抢到第” + num + “张票,剩余” + counnt + “张票”);
}
}
}

继承类 Thread
public class Test4Threand extends Thread{
private static int tickets  = 10;

private static Lock lock = new ReentrantLock();

public  void run(){
//        while (test()){
//        }
    while (true) {
        lock.lock();
        try {
            if (tickets > 0) {
                System.out.println(this.getName() + "正在销售第" + (tickets--) + "张票!");
            } else {
                System.out.println("票已经卖完了");
                break;
            }

        } finally {
            lock.unlock();
        }

    }
}

线程的休眠 thread.sleep()
线程释放CPU yield()方法可以将CPU让其他线程
使用join()方法
extends Thread implements Thunnable
使用关键字 synchronized 解决互斥问题
public synchronized int sell () {
if(ticketNum > 0) {
int num = ticketNum;
try{
Thread.sleep(200);
}
ticketNum–;
return num;
}
return 0;
}
使用Lock解决互斥问题 和synchronized一样的效果 Lock是一个接口
ReentrantLock (重入锁),ReentrantReadWriteLock (读写锁)
可以实现原子性,有序性和可见性

class Ticket {
private int ticketNum = 3;
private final Lock lock = new ReentrantLock();
public int sell(){
lock.lock(); //获取锁
try{
if(ticketNum>0){
int num = ticketNum;
try{
Thread.sleep(200);
}catch(InterruptedExcepion e){}
ticketNum–;
return num;
}
return 0;
}finally{
lock.unlock(); //释放锁
}
}
}

	https://cloud.tencent.com/developer/article/1151531			

参考博客地址

https://cloud.tencent.com/developer/article/1841361
https://blog.csdn.net/qq_43776742/article/details/97643422
https://blog.csdn.net/afreon/article/details/114770710
https://zhuanlan.zhihu.com/p/107479862
https://blog.csdn.net/weixin_44375501/article/details/108817202
https://blog.csdn.net/BrianYang1995/article/details/101692358
https://blog.csdn.net/HongYu012/article/details/123684870
https://blog.csdn.net/qq_43279936/article/details/87889530

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值