【Java多线程共享数据、同步、通信】

时间:2021-02-27 18:39:28

一、线程共享数据

  a)继承Thread,那么我们可以创建很多个这样的类,但是每个这样的类都是相互不关联的,也就是说我们Thread类中的内容每个创建出来的类都有一份,因此它不适合作为数据共享的线程来操作。同时由于Java继承的唯一性,我们只能继承一个对象。

  b)使用runnable就可以解决唯一性和不能共享的问题(不是说使用runnable就解决了共享问题,只是相对于创建Thread来说,它可以算的上是共享了,为了获得更精确的共享问题,它必须的使用线程同步操作)。实现了runnable接口的类比较适合用作共享数据。

  一个测试例子à证明runnable能实现数据共享,thread不能

  Thread_thread一个继承了Thread的线程

  Thread_runnable是一个时间了runnable的接口,他们在run里面有共同的方法

  for(int i=0;i<20;i++){

  if(ticket>0){

  System.out.println(ticket);

  ticket--;

  }

  }

  thread_thread th1=new thread_thread();

  thread_thread th2=new thread_thread();

  thread_thread th3=new thread_thread();

  th1.start();

  th2.start();

  th3.start();

  输入了三组321321321

  因为创建的是三个对象,每一个对象都拥有自己的一个备份

  将一个runnable作为参数,实例化三个thread对象

  thread_runnable ru=new thread_runnable();

  Thread th1=new Thread(ru);

  Thread th2=new Thread(ru);

  Thread th3=new Thread(ru);

  th1.start();

  th2.start();

  th3.start();

  输入了32133

  虽然说着不是完整意义上的数据共享,但是相当于上述打印三组完整的数据来说,它已经实现了数据共享,我们从中也可以看到,我们只创建了一个runnable对象(数据只产生了一份),它由三个Thread调用。

  新建三个runnable对象,分别给每一个thread传递

  Thread th1=new Thread(new thread_runnable());

  Thread th2=new Thread(new thread_runnable());

  Thread th3=new Thread(new thread_runnable());

  th1.start();

  th2.start();

  th3.start();

  打印结果是321321321

  我们可以看到我们产生了三个runnable对象,每一个都有自己的一份使用