2011-05-14 27 views
0

我正在学习线程,但不知道很多事情。在Java中,您必须拥有一个线程将访问共享变量的类?

我看到我需要实现Runnable接口并为每个线程创建相同类的各种实例来执行每个接口。这是正确的?

如果是正确的,我需要创建另一个类来包含将被所有线程访问/共享的变量?

编辑:我需要维护一些变量来协调线程工作,否则他们将执行相同的工作。这将是所有线程共享的一个变量。

编辑2:这个问题与此有关:How I make result of SQL querys with LIMIT different in each query?。我需要维护已经完成对数据库查询的线程的数量来设置OFFSET参数。

回答

1

每个线程都需要一个Runnable的实例来完成它的工作,是的。在某些情况下,线程可以共享同一个实例,但前提是实例中不需要在线程之间不同的状态。 一般你会想要在每个线程中的不同实例。

线程应该尽可能少地分享状态以避免问题,但是如果您确实想共享状态,一般而言,您需要一个或多个实例来保存该状态。

请注意,此共享状态也可以保存在类变量中,而不是实例变量中。

+0

我如何在一个实例变量中共享这个,如果每个实例都有它自己的变量? – 2011-07-18 17:25:36

+0

这将是一个线程外的对象,但它们之间共享,就像你在你的问题中提出的那样。每个线程都具有与该对象相同的引用,并且该对象具有在线程之间进行协调所需的变量。 – DNA 2011-08-01 10:56:33

1

有很多方法可以解决这个问题......这实际上是一个关于设计模式的问题。

每个线程都可以通过它的构造函数提供一个对象或描述其独特工作的对象。

或者您可以为线程提供对工作队列的引用,从中可以查询下一个可用任务。

或者你可以把在实现Runnable类,可以由主线程调用的方法...

许多方法对皮肤这只猫。我敢肯定有螺纹现有库工作分配,配置等。

1

让我们把所有的东西放在他们的位置。 声明new Thread(r)创建线程。但是这个线程仍然不能运行。如果说”

Thread t = new Thread(r); 
t.start(); 

你做的线程来运行,即执行你可运行的run()方法。

其他(等于)的方式来创建和运行的线程是从Thread类,并覆盖默认实现继承其run()方法。

现在,如果你有特定的逻辑,你希望在不同的线程同时运行相同的逻辑,你必须创建不同的线程,如果您希望实现Runnable接口的执行其start()方法。 和你的逻辑不需要重新创建任何参数,甚至可以只创建可运行实现的一个实例并将其运行到不同的线程中。

public class MyLogic implements Runnable { 
    public void run() { 
     // do something. 
    } 
} 


//// ................ 


Runnable r = new MyLogic(); 
Thread t1 = new Thread(r); 
Thread t2 = new Thread(r); 

t1.start(); 
t2.start(); 

现在这个逻辑在2个独立的线程中运行simultaniusly,而我们只创建了MyLogic的一个实例。

如果你的逻辑需要参数,你应该创建单独的实例。

public class MyLogic implements Runnable { 
    private int p; 
    public MyLogic(int p) { 
     this.p = p; 
    } 
    public void run() { 
     // this logic uses value of p. 
    } 
} 


//// ................ 


Thread t1 = new Thread(new MyLogic(111)); 
Thread t2 = new Thread(new MyLogic(222)); 

t1.start(); 
t2.start(); 

这2个线程运行相同的逻辑与不同的参数(111和222)。

顺便说一句,这个例子展示了如何将值传递给线程。要从中获取信息,您应该使用类似的方法。定义成员变量result。该变量将通过方法run()启动。提供适当的吸气剂。现在,您可以将线程结果传递给任何有兴趣执行此操作的人。

上面明显描述的是基础知识。我没有提及任何有关同步,线程池,执行程序等的内容,但我希望这会帮助你开始。然后找到一些Java线程教程,并通过它。几天后,您将成为java线程的世界级专家。 :)

快乐线程。

+0

非常感谢。对我这样的初学者来说,这是一个很好的教训:d – 2011-05-14 17:13:33