Java 多线程编程相关

一、多线程的两种实现

Thread类

1、public Thread()
2、public Thread(Runable target)
3、public Thread(String ThreadName)
4、public Thread(Runable target,String ThreadName)
常用方法:start()、sleep()、setName()、setPriority()、MAX_PRIORITY属性、isAlive()

Runable接口

Thread thread=new Thread(new XXXRunable);

二、线程的状态

1、新建状态:new以后的状态
2、就绪状态:start()以后的状态
3、运行状态:run()以后
4、阻塞状态:sleep()或join()以后、时间完成以后进入就绪状态、不放弃对象锁
5、等待状态:wait()以后、自动放弃对象锁、只能当调用notify()或nofifyAll()方法此线程进入锁池状态
6、锁池状态:从锁池状态出去进入就绪状态
7、终止状态:完成

三、线程同步

两个线程同时操作同一个资源,会造成数据错乱的问题,所以要进行线程同步。
线程同步实现方法:
1、方法:synchronized void methodA(){}
2、代码块:synchronized(object){}
用synchronized执行的方法和代码块必须是单线程的、多个线程同时执行必须排队。

四、线程间通信

主要使用:wait()、nofity()、notifyAll()这戏方法作为Object类的final方法出现的,这三个方法只能在synchronized方法中调用
1、wait():告知被调用的线程退出监视器并进入等待状态、直到其他线程进入相同的监视器并调用notify()、调用的线程将放弃CPU、放弃对象锁、进入监视器的等待池。
2、notify():通知第一个调用的wait()的线程、notifyall是所有线程、进入就绪状态、重新获得监视器的锁定才能继续。

相关代码供理解:

import java.util.LinkedList;

public class Pool {

    private LinkedList<Integer> store=new LinkedList<>();

    int MAX=20;

    public synchronized int add(Integer i){  //解决线程安全的问题
        if(store.size()>MAX){
            try {
                wait();    //解决死锁生产者消费者问题(防止爆仓)
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        store.add(i);
        notifyAll();  //通知所有进程抢占CPU,解决死锁的问题(生产者消费者都在等待队列中,notify的话只能唤醒一个,如果是消费者,此时仓中没有东西,一直是消费者,会引发死锁的问题)
        return i;
    }

    public synchronized int remove(){
        if(store.isEmpty()){
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        int n=store.removeFirst();
        notifyAll();
        return n;
    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值