2020.4.10学习笔记 Java多线程 同步阻塞 线程通信 线程池

同步方法 非静态的同步监视器当前类本身
synchronized 
public static synchronized int gethello(){}//线程安全
synchronized(bank.class)//效率比较低
如果遇到判断注意判断的地方

//死锁问题:就是两个程序交错执行,导致退不出来
解决方法:专门的算法,减少同步资源的使用,减少嵌套
//线程安全问题三:Lock锁
private ReentrantLock lock = new ReentrantLock();
lock.lock();//调用锁定方法
lock.unlock()//调用解锁方法
synchronized和lock方式的异同:相同点,用来解决线程安全问题
                            不同点:        调用完同步方法会自动解锁 但是lock必须手动解锁

如何解决线程安全问题:上面的两种//慎用this

线程通信
wait()当前线程进行阻塞,并释放同步监视器
notify()唤醒被wait()的一个线程,优先级高的优先  notifyALL()唤醒所有的线程
//这三个方法必须用在同步代码块或者同步方法
//必须是同步代码块中的同步监视器
synchronized(obj):obj同步监视器
面试题sleep()和wait()方法的异同
//相同点:一旦执行就会进入阻塞状态
//不同点:位置:sleep()Thread类中,wait()Obj类中
//        wait必须在同步代码块中,sleep在任意方法都可以
//        

Callable
//1.创建一个实现Callable的实现类
hello inplements Callable{
    @Override
    public Object call() throws Exception{

    }
}
//2。实现call方法,经此线程执行的操作在call()中声明
3.实现Callable接口实现类的对象
hello hello2 = new hello();
4.将此Callable接口实现类的对象作为传递到FutureTask的构造器,创建FutureTask的对象
FutureTask futureTask = new FutureTask(numThread);
5.将FutureTask的对象作为参数传递到Thread类的构造器中,创建Thread对象,并调用start()
new Thread(futureTask).start();
6。获取Callable中call方法的返回值
Object sum = futureTask.get();

//call有返回值
//call可以抛出异常,被外面捕获
//Callable可以支持泛型


使用线程池
ExecuteService service = Executors.newFixedThreadPoll(10);
service.excute()//适合用runnable,里面仍然需要传一个Runnable对象,也就是i你仍然需要实现runnable接口
service。submit()//适合用Callable
//提高相应速度,降低资源消耗 便于线程管理 
service.shutdown();
.getClass()获取当前类的类型
遇到类的时候可以强转
ThreadPoolExecuter service1 = (Thre    adPoolExecuter) service;
service1.setCorePoolSize(15);
 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值