这个分两种情况说:
一、如果多个线程共享某个数据,线程的run()方法执行的代码相同,可以使用同一个Runnable对象,这个Runnable对象中存放共享的数据。然后使用Thread类传递Runnable对象创建若干个线程,这样可以实现多个线程共享某个数据。
二、如果多个线程共享某个数据,线程的run()方法执行的代码不同
A,那么可以定义一个类,将共享数据封装到这个对象中;然后,实现多个Runnable(至少两个),把定义的这个类的对象传递 给Runnable子类的构造函数,每个线程对共享数据的操作也定义在这个定义的类中,这样可以方便的实现对这个共享数据的互斥和同步。这种方法可以参见毕老师讲解的线程同步中的生产者和消费者的例子。毕老师先定义了一个资源类,然后定义两个实现Runable接口的生产者和消费者,对于共享资源的操作也定义在了生产者和消费者中。然后主函数中通过传递对应的Runnable对象创建Thread对象,从而实现了不同线程对共享数据的不同操作。
B,还可以通过内部类实现。将Runnable对象作为某一个类的内部类,把共享的资源作为这个外部类的成员变量,每个线程对共享数据的操作方法也分配给外部类,方便实现共享数据进行的各个操作的互斥与同步,作为外部类的各个Runnable对象调用外部类的这些方法。
另外:我们在学习static关键字时候,静态有个特点:被静态修饰的成员可以被所有的对象所共享,所以可以简单方便的把需要共享的数据定义为静态。例如,在毕老师讲解直接通过Thread类创建线程时演示卖火车票的例子,刚开始i就是把火车票定义为了静态,然后引入了通过Runnable创建线程的方式。需要说的是:一般我们不通过静态实现线程对数据的共享。 |