2020-04-16线程同步控制

  • 同步控制:是指同一资源只能同时被一个对象调用,当这个对象调用结束后才能被其他的对象调用
  • 在所要调用的方法前加上synchronized
  • 例:synchronized char get(){};
    *注意的是:1.当用synchronized注释多个方法的时候,使得这些方法“连在一起”
  • 当有一对象调用其中的一个方法的时候,别的对象无法对其他的方法进行调用
  • 2.标识的资源可以是一种类型的数据,也就是对象,也可以是一个方法,也可以是一段代码
  • 当我们对整个类进行标识的时候,就会使得这类之中的所有的东西同一时间只能被一个对象调用
  • 3.当我们编写程序的时候最好将定义同步的类和实现其他的方法的类分开,以免弄混,使得程序出错

/**
 * @Author 李腾飞
 */
class Common{//定义同步资源
    private char ch;
    private boolean available=false;
    synchronized char get(){
        while(available==false)
            try
            {
                wait();//当没有产品时,一直挂起,不能进行售卖
            }
        catch (InterruptedException e){}
    available=false;
            notify();
            return ch;
    }
    synchronized void put(char newch){//当对象调用这个方法的时候就会得到互斥锁,使之避免多个线程对同一自资源的访问
        while(available==true)
            try
            {
                wait();//当有产品的时候,就一直挂起,不进行上架
            }
        catch(InterruptedException e){}
        ch=newch;
            available=true;
            notify();
    }
}
class Produce extends Thread {
    private Common comm;
    public Produce(Common thiscomn){
        comm=thiscomn;
    }
    public  void run(){
        char c;
        for (c='a';c<'e';c++){
            System.out.println("生产的数据是:"+c);
            comm.put(c);
        }
    }
}
class Consumer implements Runnable{
    private Common comm;

    public Consumer(Common thisComm) {
        comm = thisComm;
    }
    public void run(){
        char c;
            for (int i=0; i<5;i++){
                c=comm.get();
                System.out.println("消费者得到的数据是:"+c);
            }
        }
    }

public class 线程同步控制 {
    public static void main(String[] args) {


        Common comm = new Common();
        Produce p = new Produce(comm);
        Consumer c = new Consumer(comm);
        p.start();
       new Thread(c).start();//注意此时的激活程序只能放在main函数之中
}}
注意激活线程时的注意点:
Consumer v=new Consumer(comm);
此时的V虽然是实现Runnable接口的类的对象,但是Thread之中的很多方法却不能够进行使用
  想要使用 Thread的方法就要重新定义一个Thread线程,将所建的对象作为参数放入其中
 此时参数的run()方法就会被线程所调用
  new Thread(v).start();//创建Thread类的匿名对象,将v作为参数放入其中,再调用start方法将线程激活
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 本文主要讲了java中多线程的使用方法、线程同步、线程数据传递、线程状态及相应的一些线程函数用法、概述等。 首先讲...
    李欣阳阅读 7,245评论 1 15
  • Java多线程学习 [-] 一扩展javalangThread类 二实现javalangRunnable接口 三T...
    影驰阅读 8,138评论 1 18
  • 相关概念 面向对象的三个特征 封装,继承,多态.这个应该是人人皆知.有时候也会加上抽象. 多态的好处 允许不同类对...
    东经315度阅读 6,372评论 0 8
  • 林炳文Evankaka原创作品。转载自http://blog.csdn.net/evankaka 本文主要讲了ja...
    ccq_inori阅读 3,928评论 0 4
  • 对象的创建与销毁 Item 1: 使用static工厂方法,而不是构造函数创建对象:仅仅是创建对象的方法,并非Fa...
    孙小磊阅读 6,377评论 0 3

友情链接更多精彩内容