2013-07-17 8 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 как поле на объект типа Demo. th не является полем, а скорее локальной переменной и может ссылаться непосредственно (т. Е. Без префикса o.). Во-вторых, sum() и diff() не могут быть вызваны против экземпляра Thread, поскольку эти методы не определяются потоком, а скорее вашим собственным классом Demo.

Все эти проблемы, связанные с компиляцией, даже не являются корневой проблемой для этого кода. Основываясь на вашем коде, кажется, что у вас есть некоторые фундаментальные недоразумения в отношении синтаксиса и структуры программ Java, поэтому вам может понадобиться пройти некоторые учебные пособия начального уровня, прежде чем пытаться решить параллельное программирование. Но для полноты здесь кратко объясняется, что вам нужно сделать, чтобы ваша программа работала.

Когда вы вызываете Thread.start(), он будет разветвлять поток и вызывать метод run() Runnable, который вы передали в конструктор этого объекта потока.

Чтобы вызвать два разных метода, вам нужно создать два разных класса, реализующих 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 для обоих потоков, они будут выполнять один и тот же код. ОП пытается выполнить два разных метода каждый в своем потоке. Самый простой способ сделать это - две разные реализации Runnable. –

+0

Я думаю, вы правы в использовании двух разных классов. Виноват! – CKing

0

Вы получаете эту ошибку, потому что вы пытаетесь получить доступ к локальной переменной Нить, используя объект класса Demo, и вы не можете вызвать метод напрямую, если вы хотите это его запустить это в отдельном потоке. Новый поток будет появляться только тогда, когда вы вызываете метод 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 заставит компилятор искать общедоступное статическое поле уровня класса в классе Demo с именем th. Поскольку в классе Demo нет такого поля, вы получите сообщение об ошибке.

Смежные вопросы