2013-07-17 89 views
0

我是java的初学者。我一直在研究多线程。我想创建两个线程,这两个线程必须同时运行不同的方法。这里这些线程应该调用sum和diff方法并同时运行。但是我收到一个错误,该方法应该是线程类型。如何实现它。从线程调用函数

class Demo implements Runnable 
{ 
    void sum() 
    { 
     //Some lines of code 
    } 

    void diff() 
    { 
     //Some lines of code 
    }   
    public void run() 
    { 
     System.out.println("Inside run"); 
    } 

} 



class Test 
{ 
    public static void main (String []args){ 
     Demo o = new Demo(); 
     Demo o1 = new Demo(); 
     Thread th = new Thread (o); 
     Thread th1= new Thread(o1); 
     th.start(); 
     th1.start(); 
     o.th.sum(); // getting error here 
     o1.th1.diff(); // getting error here 
    } 
} 
+0

Google? http://docs.oracle.com/javase/tutorial/essential/concurrency/simple.html – VolatileDream

+0

格式化您的代码 – Anton

+3

您需要从运行方法中调用各种方法。但是,如果你是java新手,多线程并不是开始冒险的好地方。 – nook

回答

1

,首先你有一个编译错误,因为你想引用变量th作为一个字段类型演示的对象。 th不是一个字段,而是一个局部变量,可以直接引用(即没有0​​前缀)。其次,sum()diff()不能针对Thread实例调用,因为这些方法不是由线程定义的,而是由您自己的Demo类定义的。

就这么说,这些编译问题甚至不是这个代码的根本问题。根据你的代码,你对Java程序的语法和结构有一些基本的误解,所以在试图解决并发编程之前,你可能会通过一些入门级的教程受益。但是,为了完整起见,下面简要说明为了使程序正常工作需要做什么。

当您调用Thread.start()时,它将分叉一个线程并调用您传递给该线程对象的构造函数的Runnable的run()方法。

为了调用两种不同的方法,您需要创建两个不同的类来实现runnable,并将两个方法实现放在每个运行方法中。

例子:

public class Sum implements Runnable { 
    public void run() { 
     //Add up your numbers 
    } 
} 

public class Diff implements Runnable { 
    public void run() { 
     //Subtract numbers 
    } 
} 


public class Test { 
    public static void main(String[] args) { 
     Thread sumThread = new Thread(new Sum()); 
     Thread diffThread = new Thread(new Diff()); 
     sumThread.start(); 
     diffThread.start(); 
    } 
} 
+0

没有必要创建两个不同的类。您可以将同一个Runnable实现者的对象传递给两个线程,并且仍然可以获得与您的代码相同的结果。另外,OP想知道错误的原因。你的代码只是删除了OP代码中的错误陈述,而不是回答这个问题。 – CKing

+1

你的陈述的第一部分是不正确的。如果你为两个线程使用相同的Runnable实现,它们将执行相同的代码。 OP正试图在自己的线程中执行两种不同的方法。最简单的方法是使用两种不同的Runnable实现。 –

+0

我想你是正确的使用两个不同的类。我的错! – CKing

0

您收到此错误,因为你正在尝试使用演示类的对象来访问线程的局部变量,你不能直接调用,如果你想就是它运行的方法它在一个单独的线程中。一个新的线程只会在你调用线程类的start()方法时产生,然后它将在run()方法中执行代码。

根据您的要求创建两个线程,这两个线程必须同时运行不同的方法,下面的代码应该工作。

class Demo implements Runnable 
{ 
    public void run() 
    { 
     //sum() method code 
    } 
} 

class Demo1 implements Runnable 
{ 
    public void run() 
    { 
    //diff() method code 
    } 
} 


class Test 
{ 
    public static void main (String []args){ 
     Demo o = new Demo(); 
     Demo1 o1 = new Demo1(); 
     Thread th = new Thread (o); 
     Thread th1= new Thread(o1); 
     th.start(); 
     th1.start(); 
    } 
} 
+0

OP想知道错误的原因。你所做的只是从他的代码中删除错误的陈述。这是如何回答这个问题的? – CKing

1

假设您收到编译错误,语句o.th.sum()不正确。

声明o.th将导致编译器在名为th的Demo类中查找公共静态类级别字段。由于Demo类中没有这样的字段,因此会出现错误。