Android-线程常用方法-线程同步

线程常用方法:

1.start():线程调用该方法将启动线程从新建状态进入就绪,一旦轮到享用CPU资源时,就开始自己的生命周期

2.run():Thread类的run()方法与Runnable接口的run()方法的功能和作用相同,都用来定义线程对象被调度之后所执行的操作,都是系统自动调用而用户程序不得引用的方法

3.sleep(int millsecong):优先级高的线程可以在它的run()方法中调用sleep方法来使自己放弃CPU资源,休眠一段时间

4.isAlive():线程处于"新建"状态时,线程调用isAlive()方法返回false,在线程的run()方法结束之前,即没有进入死亡状态之前,线程调用isAlive()方法返回true

5.currentThread():该方法是Thread类中的类方法,可以用类名调用,该方法返回当前正在使用CPU资源的线程

6.interrupt():一个正在使用CPU资源的线程可以让休眠的线程调用interrupt()方法"吵醒"自己,即导致休眠的线程发生InterruptedException异常,从而结束休眠,重新排队等待CPU资源

线程同步

所谓线程同步就是用synchronized关键字修饰同步方法,即程序中的若干个线程都需要使用一个方法,而这个方法用synchronized给予了修饰

多个线程调用synchronized方法必须遵守同步机制:当一个线程使用这个方法时,其他线程想使用这个方法就必须等待,直到线程使用完该方法,使用多线程解决许多实际问题时,可能要把某些修改数据的方法用关键字synchronized来修饰

线程同步的方式和机制:

临界区、互斥量、事件、信号量四种方式

临界区(Critical Section)、互斥量(Mutex)、信号量(Semaphore)、事件(Event)的区别

1、临界区:通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问。在任意时刻只允许一个线程对共享资源进行访问,如果有多个线程试图访问公共资源,那么在有一个线程进入后,其他试图访问公共资源的线程将被挂起,并一直等到进入临界区的线程离开,临界区在被释放后,其他线程才可以抢占。

2、互斥量:采用互斥对象机制。 只有拥有互斥对象的线程才有访问公共资源的权限,因为互斥对象只有一个,所以能保证公共资源不会同时被多个线程访问。互斥不仅能实现同一应用程序的公共资源安全共享,还能实现不同应用程序的公共资源安全共享

3、信号量:它允许多个线程在同一时刻访问同一资源,但是需要限制在同一时刻访问此资源的最大线程数目

4、事 件: 通过通知操作的方式来保持线程的同步,还可以方便实现对多个线程的优先级比较的操作

public class Demo45{

public static void main(String[] args){
    Bank bank = new bank();
    bank.setMoney(200);
    System.out.println("银行账上还有200");

    Thread accountant = new Thread(bank);
    accountant.setName("会计");
    Thread cashier = new Thread(bank);
    cashier.setName("出纳");

    accountant.start();
    cashier.start();
}

}

public class Bank implements Runnable{

int money;

 public void setMoney(int n){
    money = n;
}

@Override
public void run(){
    if(Thread.currentThread().getMoney().equals("会计")){
        saveOrTake(300);
    }else if (Thread.currentThread().getMoney().equals("出纳")){
        saveOrTake(150);
    }
}

public synchronized void saveOrTake(int money){
    if(Thread.currentThread().getMoney().equals("会计")){
        for(int i = 0;i < 3; i++){
           money = money+m/3;
           System.out.println(Thread.currentThread().getName()+"存入"+m/3",账上还有"+money+",休息一会再存");

           try{
           Thread.sleep(1000);
        }catch(InterruptedException e){
           e.printStackTrace();
        }
      }
    }else if (Thread.currentThread().getMoney().equals("出纳")){
        for(int i = 0;i < 3; i++){
           money = money-m/3;
           System.out.println(Thread.currentThread().getName()+"取出"+m/3",账上还有"+money+",休息一会再取");

           try{
           Thread.sleep(1000);
        }catch(InterruptedException e){
           e.printStackTrace();
        }
    }
}

}
运行结果:
在这里插入图片描述

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值